java字节流与字符流之文件复制

时间:2022-08-18 21:01:15

java采用两种I/O读写方式:一种是inputstream和outputstream字节流,一种是Reader和Writer字符流。字节流以字节为单位读取,字符流以字符为单位读取。

一、字节读取实现文件复制

//被复制文件"第一节课.txt",复制到1.txt文件
FileInputStream fis = new FileInputStream("第一节课.txt");
FileOutputStream fos = new FileOutputStream("1.txt");
//字节流
int read2;
while((read2 = fis.read()) != -1){
fos.write(read2);
//英文占一个,中文占两个
}
//关闭
fis.close();
fos.flush();
fos.close();

二、以字符读取实现文件复制

//被复制文件"第一节课.txt",复制到1.txt文件
FileReader fr = new FileReader("第一节课.txt");
FileWriter fw = new FileWriter("1.txt");
//字符流
int read1;
while((read1 = fr.read()) != -1){
fw.write(read1);
System.out.println((char)read1); //中英文都占两个字节
}
//关闭
fr.close();
fw.flush();
fw.close();

BufferedReader和BufferedWriter实现文件复制,可一行一行读取。

//被复制文件"第一节课.txt",复制到1.txt文件
FileReader fr = new FileReader("第一节课.txt");
FileWriter fw = new FileWriter("1.txt");

BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
String read;
while((read = br.readLine())!=null){
bw.write(read);//写入1.txt
bw.newLine();//换行
System.out.println(read);
}

三、通过byte数组读取文件

FileInputStream fis = new FileInputStream("第一节课.txt");
//byte数组读取
byte[] bs = new byte[fis.available()];//available()流中可读取数据大小
int read = fis.read(bs);
System.out.println(new String(bs));
//关闭
fis.close();

对byte[]数组采用toString的方法转化为字符,会导致错误的分割方式生成字符,不能正确地显示字符;而采用String的构造函数String(byte[] b)可以正确的分割构造字符。(或者String(byte[] b, Charset a)带编码方式的构造函数,在知道要读入的文本的编码方式的情况下。)

四、创建文件输出流

java中建立文件输出流,当文件不存在时会新建一个文件,如果有同名文件,自动覆盖。不存在时自动建立。FileOutputStream的默认构造方法是直接覆盖掉原来的文件,而FileOutputStream(File file, boolean append) 的构造方法如果后面的append为true时追加到尾部而不是直接覆盖了。

FileReader fr = new FileReader("第一节课.txt");
FileWriter fw = new FileWriter("1.txt",true);
//字符流
int read1;
while((read1 = fr.read()) != -1){
fw.write(read1);
System.out.println((char)read1); //中英文都占两个字节
}

fr.close();
fw.flush();
fw.close();

追加到尾部

当创建IO对象是,文件是以独占的方式打开,就好比windows打开文件时进行删除,是无法删除的。创建文件未写入信息,是因为缺少 output.flash() 这句,将缓存内容写入文件。通常在做文件操作,要先判断文件是否存在,最后再写入操作。