一、首先讲一下字节流和字符流的区别:
在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。
在代码层面:
在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)。
在原理层面:
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。
所以如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。
二、核心类
字节流的核心类是FileReader和 FileWriter。
三、注意原则
1、不管是输入还是输出流,使用完毕后要close(),如果是带有缓冲区的输出流,应在关闭前调用flush()。
2、应该尽可能使用缓冲区,来减少IO次数,以提高性能。
3、能用字符流处理的不用字节流。
四、举例
(1):
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReader_03 {
public static void main(String[] args) {
FileReader mIn = null;
FileWriter mOut = null;
int b = 0;
try {
mIn = new FileReader("D:\\快盘\\java\\src\\mashibinSE08\\FileReader_03.java");
mOut = new FileWriter("C:\\Users\\Administrator\\Desktop\\test.txt");
while((b = mIn.read()) != -1){
System.out.print((char) b);
mOut.write(b);
}
mIn.close();
mOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
System.exit(-1);
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件读取错误");
System.exit(-1);
}
}
}
(2):
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//字符流
public class FileIO {
public static void main(String[] args){
//声明输入输出流的引用
FileReader fr = null;
FileWriter fw = null;
try {
//定义输入输出流的对象
fr = new FileReader("d:/input.txt");
fw = new FileWriter("d:/output.txt");
//定义char类型的缓冲区
char[] buffer = new char[1024];
while(true){
int temp = fr.read(buffer, 0, buffer.length);
if(temp == -1){
break;
}
fw.write(buffer, 0, buffer.length);
}
} catch (FileNotFoundException e) {
System.out.println("文件没找到");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件读取时发生IO异常!");
e.printStackTrace();
}finally {
//释放资源
try {
fw.flush();
fr.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("finish");
}
}
}