利用IO流中的FileReader和FileWriter来实现读写操作
注意:字符流是不能对非文本文件进行复制操作的
文本文件:.txt, .java, .c, .cpp
非文本文件(.jpg, .mp3, .mp4, .avi, .doc, .ppt…),使用字节流来处理
总的来说就是分为四个步骤
①造文件
②造流
③对文件的处理
④资源的关闭
在对文件的处理的时候通过一个char型数组来提高效率。
Reader抽象类的read方法(源码)
只要cbuf中还有数据,read方法就不不停的读入,直到读完返回-1
public int read(char cbuf[]) throws IOException {
return read(cbuf, 0, cbuf.length);
}
public abstract int read(char cbuf[], int off, int len) throws IOException;
通过源码注释可知,返回值为读入字节的个数
Writer抽象类的write方法(源码)
public void write(char cbuf[], int off, int len) throws IOException {
se.write(cbuf, off, len);
}
通过源码可知write方法通过第二个参数和第三个参数来写入文件中,off为起始索引,len为结束索引。所以在下面的对文件读写的操作代码中写的是fr.wirte(cbuf, 0, len)而不是fr.write(cbuf, 0, cbuf.length)因为cbuf中并不一定全部都是刚刚写入的数据。
比如说这个hello文件,如果使用前者方法读出来的是helloworld123,如果使用后者则会读出来helloworld123ld,因为read操作实际上是对cbuf数组的覆盖,而ld仍然在cbuf数组中,所以读出来的时候根据cbuf.length会读出123ld出来。
至于为什么cbuf数组的大小设置为5,这个取决于文件的大小(因为该例子文件过小所以设置为5),如果数组大小设置过大则会占用内存空间,如果数组大小设置过小,则会多次读写导致效率低,所以通常是取1024的.
import org.junit.Test;
import java.io.*;
/**
* @author LTH
* @date 2021/4/4 - 8:14
*/
public class FileReaderFileWriter {
//注意:在IDEA中单元测试方法相对路径是当前Module下,main方法的相对路径是当前工程下
@Test
/**
* 利用FileReader和FileWriter对文件进行读写操作
*/
public void fileReaderFileWriter() throws IOException {
//1.造文件
File srcFile = new File("hello.txt");
File destFile = new File("hello1.txt");
//2.造流
FileReader fr = new FileReader(srcFile);
FileWriter fw = new FileWriter(destFile);
//3.数据的读入reader和写出操作writer
//这里的char型数组可以类似为快递小哥的小车,打包好后再送会提高效率,不然多次读写磁盘会降低效率
char[] cbuf = new char[5];
int len;//记录每次读入到cbuf数组中的字符的个数
while((len = fr.read(cbuf)) != -1){
fw.write(cbuf, 0, len);
}
//4.流的关闭
fw.close();
fr.close();
}
@Test
/**
* 利用FileReader和FileWriter对文件进行读写操作
* 因为涉及到资源的关闭,所以说选择使用try-catch-finally来处理异常
*/
public void fileReaderFileWriter1() {
FileReader fr = null;
FileWriter fw = null;
try {
File srcFile = new File("hello.txt");
File destFile = new File("hello1.txt");
fr = new FileReader(srcFile);
fw = new FileWriter(destFile);
char[] cbuf = new char[5];
int len;
while((len = fr.read(cbuf)) != -1){
fw.write(cbuf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}