输入输出是相对于java虚拟机来说的,数据流向虚拟机是输入流(输入数据到虚拟机中),反之输出流。
字节流与字符流的区别,实际上字节流在操作时本身不会用到缓冲区(内存),是一个字节一个字节地读取文件,是文件本身直接操作的。字符流在操作时使用了缓冲区,通过缓冲区再操作文件,即先在内存中定义一个缓冲区(比如一个长度为1024的字符数组),读取文件时也是一个一个地把文件中的每一个字节都暂时存在这个字符数组里,直到数组被存满位置或者文件内容读完为止,再把该字符数组里的数据一并写入文件中,结合copyBuffer方法来看会容易理解一些。
import java.io.*;
public classWriterReadDemo {
public static void copyByte(){
FileReader fr = null;
FileWriter fw = null;
int in = 0;
int i = 0;
try {
fr = newFileReader("D:\\test.txt");
fw = newFileWriter("D:\\test1.txt");
while((in=fr.read())!=-1){
i++;
fw.write(in);
}
} catch(IOException e) {
System.out.println("创建文件失败!");
} finally{
try {
//关闭输入输出流
fr.close();
fw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
System.out.println("copyByte循环的次数为:"+i);
}
//设置一个缓冲区,该缓冲区为字符数组ch[],缓冲区存满了再写入
public static void copyBuffer() {
FileReader fr = null;
FileWriter fw = null;
//建立一个缓冲字符数组区,大小为1024个字节即2K
char[] ch = new char[1024];
int in = 0;
int i = 0;
try {
fr = newFileReader("D:\\test.txt");
fw = newFileWriter("D:\\test2.txt");
while((in=fr.read(ch))!=-1){
i++;
fw.write(ch);
}
} catch(IOException e) {
System.out.println("创建文件失败!");
}finally{
try {
//关闭输入输出流
fr.close();
fw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
System.out.println("copyBuffer循环的次数为:"+i);
}
public static void main(String[] args) throws IOException {
copyByte();
copyBuffer();
}
} |