一、File对象(找到指定的文件所在的路径)
- File对象不涉及文件读写操作,更贴切的来说File对象的含义应该是FilePath,它指定了文件的路径。
- File对象通过mkdir()方法创建一个文件目录,通过createNewFile()来创建文件。
- File 的构造方法需要指明文件所在的路径,有绝对路径和相对路径。
相对路径具有很多的优良特性。
二、文件字节输入、输出流
- FileInputStream、FileOutputStream,其构造方法均以文件或指定的文件路径为参数,建立指向输入、输出文件的输入流、输出流。
- FileInputStream对象通过read方法顺序的读取文件,read()方法可以读单个字节,也可以将其读入到一个byte数组中。
- FileOutputStream对象通过write方法以字节为单位向绑定的文件写数据,write方法可以写单个字节,也可以以byte数组为单位向目的文件写。
- 文件操作要注意即使的close()。
示例:
public static void outputFile(File src){
System.out.println("输出"+src.getName()+"文件如下:");
System.out.println("*********************");
int n = -1;
byte[] container = new byte[1000];
try {
FileInputStream inFile = new FileInputStream(src);
while((n=inFile.read(container))!=-1){
String line = new String(container,0,n);
System.out.print(line);
}
inFile.close();
} catch (Exception e) {
// TODO: handle exception
System.err.println("Wrong Message:"+e.getMessage());
}
}
//将从文件src中的内容读入到文件des中
public static void src2des(File src,File des){
//中间需要一个转换,用一个"容器",从src中取出一个unit,然后放入到des中
int n = -1;
byte[] container = new byte[1000];
try {
des.createNewFile();
FileOutputStream outFile = new FileOutputStream(des,false);
FileInputStream inFile = new FileInputStream(src);
while((n=inFile.read(container))!=-1){
outFile.write(container, 0, n);
}
inFile.close();
outFile.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println("Error in src2des:"+e.getMessage());
}
}
三、文件字符输入、输出流
- 文件字节输入、输出流以字节为单位读写数据不能很好的操作Unicode字符,因为有的编码不止占一个字节,要是再使用文件字节输入、输出流的话就会造成“乱码”问题。由此引入文件字符输入、输出流,FileReader、FileWriter,以字符为单位读写数据。
- FileReader对象的read方法使用字符数组读数据;FileWriter对象的write方法使用字符数组写数据。
- 除了像文件字节输入、输出流一样需要及时close()文件外,对于FileWriter对象,还有一个flush()方法。因为Writer(FileWriter继承自Writer)流,write方法将数据首先写入到缓冲区,每当缓冲区溢出时,缓冲区的内容被自动写入到目的地,如果关闭流,缓冲区中的内容会被立刻写入到目的地。流调用flush方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。
public static void outputFile(File src){
System.out.println("输出"+src.getName()+"文件如下:");
System.out.println("*********************");
int n = -1;
char[] buffer = new char[1000];
try {
FileReader inFile = new FileReader(src);
while((n=inFile.read(buffer))!=-1){
String line = new String(buffer,0,n);
System.out.print(line);
}
inFile.close();
} catch (Exception e) {
// TODO: handle exception
System.err.println("Wrong Message:"+e.getMessage());
}
}
//将从文件src中的内容读入到文件des中
public static void src2des(File src,File des){
//中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中
int n = -1;
char[] buffer = new char[100];
try {
des.createNewFile();
FileWriter outFile = new FileWriter(des,true);
FileReader inFile = new FileReader(src);
while((n=inFile.read(buffer))!=-1){
outFile.write(buffer, 0, n);
}
outFile.flush();
inFile.close();
outFile.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println("Error in src2des:"+e.getMessage());
}
}
四、缓冲流
- 尽管FileReader、FileWriter流以字符为单位读写数据,但是它不能读取一行。
- BufferReader、BufferWriter类创建的对象称为缓冲输入、输出流,二者的源和目的地必须分别是FileReader、FileWriter流(即构造参数)。
- BufferReader对象通过readLine()方法读取文本行;BufferWriter对象通过write(String s)方法将字符串s写到指定文件。此外,BufferWriter对象通过newLine()方法向目的地文件写入一个换行符。
- 将BufferReader和BufferWriter称为上层流,把它们指向的字符流称为底层流。Java采用缓存技术将上层流和底层流连接。底层字符输入流首先将数据读入缓存,BufferReader流再从缓存中读取数据;BufferWriter流将数据写入缓存,底层字符输出流会不断地将缓存中的数据写入到目的地。当BufferWriter流调用flush()方法刷新缓存或调用close()方法关闭时,即使缓存没有溢出,底层流也会立刻将缓存的内容写入到目的地。
- 在编写代码时,只需关闭上层流。那么底层流就会自动关闭。
- 缓冲流以行为单位读取,具有更强的读写能力,实际应用广。
public static void outputFile(File src){
System.out.println("输出"+src.getName()+"文件如下:");
System.out.println("*********************");
int n = -1;
char[] buffer = new char[1000];
try {
FileReader inFile = new FileReader(src);
while((n=inFile.read(buffer))!=-1){
String line = new String(buffer,0,n);
System.out.print(line);
}
inFile.close();
} catch (Exception e) {
// TODO: handle exception
System.err.println("Wrong Message:"+e.getMessage());
}
}
//将从文件src中的内容读入到文件des中
public static void src2des(File src,File des){
//中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中
int n = -1;
char[] buffer = new char[100];
try {
des.createNewFile();
FileWriter outFile = new FileWriter(des,true);
FileReader inFile = new FileReader(src);
BufferedReader in = new BufferedReader(inFile);
BufferedWriter out = new BufferedWriter(outFile);
String line = null;
while((line=in.readLine())!=null){
out.write(line);
out.newLine();
}
out.flush();
in.close();
out.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println("Error in src2des:"+e.getMessage());
}
}
note :
1.不论是用那种方式去读、写文件,当任务完成后,都应当即使关闭文件,考虑到并发多线程的资源问题。尽管Java中当程序结束后会自动关闭所有打开的流,但在程序中应该显示的关闭哪些被打开的流。
2.文件的读、写操作是可能会抛出异常的,所以对于文件的操作要放到try-catch语句块中进行。另外,一旦try中发现了异常,就会立即转向catch部分。