Java中的字符流FileReader与FileWriter详解
作者:墨辰JC
概念
在Java中,使用Unicode约定存储字符。字符流自动允许我们逐字符读/写数据,有助于执行16位Unicode的输入和输出;它是以reader和writer结尾的。
在内部,FileReader使用FileInputStream;
同样,FileWrite使用FileOutputStream,字符流采用Unicode编码。
FileReader字符输入流
Reader :字符输入流,用于读取字符流的抽象超类。
FileReader类从InputStreamReader类继承而来。和文件相关的字符输入流,可用于读取文件数据。创建对象的时候,如果指定的文件不存在,将抛出异常。
相关方法和构造器
FileReader提供了三个构造器,用于实例化FileReader对象,根据不同的场景进行选择
- read():每次读取单个字符,返回该字符,如果到文件末尾返回-1
public int read();
- read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
public int read(char[] cbuf);
演示示例
使用FileReader从E盘下的hello.txt文本读取内容,并显示
- read():单个字符读取文件(返回实际读取到的字符数)
import org.junit.jupiter.api.Test; import java.io.FileReader; import java.io.IOException; @Test public void readFile01(){ String filePath = "E:\\test.txt"; FileReader fileReader = null;//创建FileReader对象 int data; try { fileReader= new FileReader(filePath); //循环读取 while ((data = fileReader.read())!=-1){ System.out.print((char) data); } } catch (IOException e) { e.getMessage(); }finally { if (fileReader!=null){ try { fileReader.close();//释放内存 } catch (IOException e) { e.getMessage(); } } } }
- read(Char[] cbuf) 使用字符数组读取文件 这里使用了String的构造器用于将buf转换为字符串
@Test public void readFile02() { String filePath = "E:\\test.txt"; FileReader fileReader = null;//创建FileReader对象 int readLen = 0; char[] buf = new char[8]; try { fileReader = new FileReader(filePath); // while ((readLen = fileReader.read(buf)) != -1) { System.out.print(new String(buf, 0, readLen)); } } catch (IOException e) { e.getMessage(); } finally { if (fileReader != null) { try { fileReader.close();//释放内存 } catch (IOException e) { e.getMessage(); } } } }
执行完毕之后,会读取到文本中相应的内容!
FileWriter字符输出流
FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。与FileOutputStream基本类似,只是前者是基于字符流后者是基于字节流。
相关方法和构造器
FileWriter提供了五个构造器,用于实例化FileWriter对象,根据不同的场景进行选择
- FileWriter(File file, boolean append);此构造器为追加模式,当append为true时追加到文件的末尾,否则覆盖
- public void write(int c); 写入单个字符
- public void write(char[] cbuf); 写入指定数组
- public void write(char[] cbuf, int off, int len); 写入指定数组指定的部分
- public void write(String str); 写入整个字符串
- public void write(String str, int off, int len); 写入字符串的指定部分
注意:FileWriter使用后,必须关闭(close)或刷新(flush),否则写入不到指定的文件(还在内存里面)!
演示示例(使用的是追加构造器)
将文本内容输出到E盘的test.txt文件 这里使用了Stirng类中的toCharArray方法:将字符串转换成字符数组
import org.junit.jupiter.api.Test; import java.io.FileWriter; import java.io.IOException; @Test public void WriteFile02() { String filePath = "E:\\test.txt";//操作的文件路径 //创建FileWrite对象 FileWriter fileWriter = null; char[] chars = {'a', 'b', 'c'}; try { fileWriter = new FileWriter(filePath, true); fileWriter.write('a');//写入单个字符 fileWriter.write(chars);//写入指定数组 fileWriter.write("hello,world".toCharArray(), 0, 5); //写入字符数组的指定部分 写入hello fileWriter.write("Java");//写入整个字符串 fileWriter.write("你好,世界",0,2);//写入字符串的指定部分 } catch (IOException e) { e.getMessage();//输出异常l } finally { try { fileWriter.close();//释放资源 } catch (IOException e) { e.getMessage(); } } }
此时,上述代码执行之后,test.txt的内容变成:aabchelloJava你好
在数据量大的情况下,可以使用循环操作!
为什么用完不close或flush,会写入不到数据?
当我们在close方法处进行断点进行调试的时候,会发现FileWriter真正写入数据的时候,是在close方法中!
一直下一步,真正添加数据是在这里
flush(刷新):方法同理,也会追加到这里
到此这篇关于Java中的字符流FileReader与FileWriter详解的文章就介绍到这了,更多相关Java的FileWriter和FileReader内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!