Java IO 的流,有三个分类的维度:
- 输入流 or 输出流
- 节点流 or 处理流
- 字节流 or 字符流
FileReader和FileWriter是Java IO流中用于处理字符文件读取和写入的两个类,它们分别继承自Reader和Writer,是处理文本文件的便利类
一 FileReader(字符流、节点流、输入流)
1. 定义与用途
- FileReader类用于从文本文件读取数据,每次读取一个字符或者一个字符数组。它继承自InputStreamReader,并默认使用平台默认的字符编码来解码文件内容。
2. 构造方法
- FileReader(File file): 根据给定的File对象构造一个FileReader对象。
- FileReader(String fileName): 根据给定的文件名构造一个FileReader对象。
- FileReader(FileDescriptor fd): 构造一个与给定文件描述符相关联的FileReader对象。
3. 常用方法
- int read(): 读取文件中的下一个字符,并返回它。如果到达文件末尾,则返回-1。
- int read(char[] cbuf, int off, int len): 读取文件中的字符,并将它们存储到字符数组cbuf中,从cbuf[off]开始的位置存储,最多读取len个字符。返回实际读取的字符个数,如果到达文件末尾,则返回-1。
- void close(): 关闭流并释放与流相关联的任何系统资源。
4. 注意事项
- FileReader要求文件必须存在,否则将抛出FileNotFoundException。
- 读取文件时,建议使用try-with-resources语句或try-catch-finally语句来确保流资源被正确关闭。
5. 示例一:使用 read() 单个字符读取
下面的代码实现了功能:读取文件内容,并显示。
在 d:\abc.txt
文件中,有一行“hello,csdn.net” 文字;使用了 read()
方法,单个字符读入,并打印出来。
public class FileReaderDemo {
/**
* 读取文件内容,并显示
*/
@Test
public void fileReader(){
String filePath = "d:\\abc.txt";
int data = 0;
try {
FileReader fileReader = new FileReader(filePath);
//使用read循环读取,单个字符读入
while((data = fileReader.read())!=-1){
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行后,输出结果:
hello,csdn.net
6.示例二:使用 read(char[] cbuf) 按照字节数组读取,提升效率
还是上面的文件d:\abc.txt
,这次内容变为两行
Hello,world!
Hello,csdn 官网!
public class FileReaderDemo {
/**
* 字符数组读取文件
*/
@Test
public void fileReader1(){
String filePath = "d:\\abc.txt";
//字符数组
char[] buf = new char[8];
int readData = 0;
FileReader fileReader = null;
try {
fileReader = new FileReader(filePath);
//循环读取,使用read(buf),返回的是实际读取到的字符数
//返回-1,说明文件结束
while((readData = fileReader.read(buf))!=-1){
System.out.print(new String(buf,0,readData));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileReader!=null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
执行测试方法后,输出内容为:
Hello,world!
Hello,csdn 官网!
二 FileWriter (字符流、节点流、输出流)
1. 定义与用途
- FileWriter类用于向文本文件写入数据,每次写入一个字符、一个字符数组或者一个字符串。它继承自OutputStreamWriter,并默认使用平台默认的字符编码来编码写入的数据。
2. 构造方法
- FileWriter(File file): 根据给定的File对象构造一个FileWriter对象。如果文件已存在,则会被覆盖。
- FileWriter(File file, boolean append): 根据给定的File对象构造一个FileWriter对象。如果append为true,则写入的数据会追加到文件末尾,而不是覆盖文件。
- FileWriter(String fileName): 根据给定的文件名构造一个FileWriter对象。如果文件已存在,则会被覆盖。
- FileWriter(String fileName, boolean append): 根据给定的文件名构造一个FileWriter对象。如果append为true,则写入的数据会追加到文件末尾,而不是覆盖文件。
- FileWriter(FileDescriptor fd): 构造与给定文件描述符相关联的FileWriter对象。
3. 常用方法
- void write(int c): 写入一个字符。
- void write(char[] cbuf): 写入一个字符数组。
- void write(char[] cbuf, int off, int len): 写入字符数组的一部分,从cbuf[off]开始,写入len个字符。
- void write(String str): 写入一个字符串。
- void write(String str, int off, int len): 写入字符串的一部分,从str[off]开始,写入len个字符。
- void flush(): 刷新流,将缓冲区中的数据写入底层输出流中。
- void close(): 关闭流并释放与流相关联的任何系统资源。
4. 注意事项
- 如果指定的文件不存在,FileWriter会在写入数据时自动创建该文件。
- 写入文件时,建议使用try-with-resources语句或try-catch-finally语句来确保流资源被正确关闭。
- 当使用FileWriter的append模式时,如果文件已存在,则写入的数据会追加到文件末尾,而不是覆盖文件。
5.示例
public class FileWriterDemo {
@Test
public void fileWriter(){
String filePath = "d:\\file-writer.txt";
FileWriter fileWriter = null;
String outTxt = "翠花,上酸菜!";
char[] cui = {'c','u','i','h','u','a'};
try {
fileWriter = new FileWriter(filePath);
fileWriter.write('C');
fileWriter.write(cui);
fileWriter.write(cui,0,3);
fileWriter.write(outTxt);
fileWriter.write(outTxt,0,4);
//在数据量大时,可以使用循环操作
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//fileWriter.flush();
//关闭文件流,等价于 flush() + 关闭
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
执行测试方法后,输入结果为:
三 综合使用 FileReader 和 FileWriter 拷贝文件
由于FileReader 和 FileWriter 是针对字符流的,所以图片等二进制文件拷贝后,无法正常打开。
所以我们来拷贝文本文件。
public class FileCopy2 {
@Test
public void fileCopy() throws IOException {
String srcPath = "d:\\raokouling_src.txt";
String targetPath = "d:\\raokouling_target.txt";
char [] buf = new char[1024];
int readLength = 0;
FileReader fileReader = new FileReader(srcPath);
FileWriter fileWriter = new FileWriter(targetPath);
while((readLength = fileReader.read(buf))!=-1){
fileWriter.write(buf,0,readLength);
}
fileReader.close();
fileWriter.close();
}
}
执行测试方法后,在d盘生成了:raokouling_target.txt,我们打开后,与src中的一致:
以上就是 Java IO 中的 FileReader 和 FileWriter 的全部内容,感谢阅读!