文件IO
我们在开发java应用程序中,会使用File类,FileWriter类,FileReader类,同时也会使用FileOutputStream,FileInputStream,BufferInputStream,BufferOutputStream。那么有这些类可以让我们非常方便的读取文件,如下面的这个例子,是java的文件读取例子
// 读取文件中的字符
private static void readString() throws Exception{
File _file = new File("e:"+separetor+"a.txt") ;
if (!_file.exists()) {
boolean createStatuts = _file.createNewFile() ;
if (createStatuts) {
System.out.println("创建了一个新文件 ,并且创建成功了");
}else {
System.out.println("创建新文件失败");
}
}
// 创建输入流
InputStream fileInputStream = new FileInputStream(_file) ;
byte[] bytes = new byte[1024] ;
int len = -1;
StringBuffer buffer = new StringBuffer() ;
while ((len = fileInputStream.read(bytes)) != -1) {
buffer.append(new String(bytes,0,len)) ;
}
// 关闭输入流
fileInputStream.close() ;
System.out.println(buffer.toString());
}
// 将字符串写入文件
private static void writeString() throws Exception{
File _file = new File("e:"+separetor+"a.txt") ;
if (!_file.exists()) {
boolean createStatuts = _file.createNewFile() ;
if (createStatuts) {
System.out.println("创建了一个新文件 ,并且创建成功了");
}else {
System.out.println("创建新文件失败");
}
}
// 创建输出流
OutputStream fileOutputStream = new FileOutputStream(_file) ;
String info = "《op 青空 pure rouge 君吻》《君吻 その目に映るもの piano》" ;
fileOutputStream.write(info.getBytes()) ;
// 关闭输出流
fileOutputStream.close() ;
}
这个例子是我抄的,大家如果想进一步看,请查看文件IO
那么其实不管是java还是C语言,流程是一样的
1. 创建一个File对象,用于实际操作
2. 构建输入输出流
3. 创建缓存区,缓存读写数据,将内容从缓存中读取获取输入到内存中
4. 关闭流
#include<stdio.h>
void readTextFile(){
char* path = "/niupuyue/callback.c";
//打开文件
FILE* fp = fopen(path,"r");
if(fp == NULL){
printf("打开文件失败\n");
return;
}
//创建字符缓冲区,每次读取一个字符串,都会缓存到字符数组中
char buffer[1024];
while(fgets(buffer,1024,fp)){
printf("%s",buffer);
}
//关闭文件流
fclose(fp);
}
//写入文本文件
void writeTextFile(){
char* path = "/niupuyue/test.c";
char* content = "大鹏一日同风起,扶摇直上九万里";
//打开文件
//打开只写文件,如果文件存在则文件长度清0,即该文件内容会消失,若文件不存在则建立该文件
FILE* fp = fopen(path,"w");
if(fp == NULL){
printf("打开文件失败");
return;
}
//写入文件
fputs(content,fp);
//关闭文件流
fclose(fp);
}
int main(){
writeTextFile();
}
首先通过fopen()
函数,得到一个文件指针,操作符r为读取文件流,构建一个buffer的数据缓存区,通过fget
循环读取内容,fclose
关闭文件流。其中fopen
函数非常重要,fopen
的函数声明格式是:
_ACRTIMP FILE* __cdecl fopen(
_In_z_ char const* _FileName,
_In_z_ char const* _Mode
);
在这里我们会发现需要传入的有文件全路径名称,然后还有一个mode,这个mode表示我们打开文件的方式,常用的mode样式
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。ode有下列几种形态字符串:
上面的所有操作都是操作文件,但如果操作的是二进制文件,则需要在上面的mode的内容上面添加b
,如rb
,wb
等
但是操作的流程不变
二进制文件读写
/*读写二进制文件 -- 复制文件*/
void fileCopy() {
char* currentPath = "E:\\android_pdf\\研磨设计模式.pdf";
char* destPath = "E:\\android_pdf\\研磨设计模式_new.pdf";
// 打开文件
FILE* currentFile_P = fopen(currentPath, "rb");
FILE* destFile_P = fopen(destPath, "wb");
// 先读取再写入
int buffer[1024]; // 数据缓冲区
int len; // 每次读取数据的长度
while ((len = fread(buffer,sizeof(int),1024,currentFile_P)) != EOF)
{
// 将缓冲区里的内容写入到文件中
fwrite(buffer, sizeof(int), len, destFile_P);
}
// 关闭流
fclose(destFile_P);
fclose(currentFile_P);
}
二进制文件读写其实和文件的读写是相同的,唯一不同之处在于使用rb
,wb