深入理解Java IO流:字符流
引言
在Java中,IO(输入/输出)操作是程序与外部世界交互的重要方式。
其中,File类是进行文件操作的基础,而字节流和字符流则是数据传输的两种主要方式。
本文将深入探讨这些概念及其应用。
一、字节流读取中文问题
- 字节流是万能流,更侧重于文件复制,但是尽量不要边读边看
- 原因:
- UTF-8:一个汉字占3个字节
- GBK:一个中文占2个字节
如果按照字节读取,每次读取的字节没有构成一个汉字的字节数,就直接输出,汉字是显示不了的
- 解决方法:
- 将文本文档中的内容,按照字符去操作
二、FileReader 字符输入流
字符流专门去操作文本文档,但是复制操作不要用字符流
- 概述:
- 字符输入流: Reader 抽象类
- 子类:FileReader
- 字符输入流: Reader 抽象类
- 作用:
- 将文本文档中的内容读取到内存中来
- 构造:
- FileReader(File file);
- FileReader(String path);
- 方法:
- int read() 一次读取一个字符,返回的是读取字符对应的int值
- int read(char[] cbuf) 一次读取一个字符数组,返回的是读取个数
- int read(char[] cbuf,int off ,int len ) 一次读取一个字符数组一部分,返回的是读取个数
- cbuf :读取的数组
- off :那个开始读
- len :读多少个
- void close()
- 测试
@Testpublic void demo1() throws IOException {FileReader fileReader = new FileReader("testfile.txt");int i;while (((i = fileReader.read()) != -1)) {System.out.println((char) i);}fileReader.close();}@Testpublic void demo2() throws IOException {FileReader fileReader = new FileReader("testfile.txt");int i;char[] chars = new char[2];while (((i = fileReader.read(chars)) != -1)) {System.out.println(new String(chars, 0, i));}fileReader.close();}
三、FileReader 字符输出流
- 概述:
- 字符输入流: Writer 抽象类
- 子类:FileWriter
- 字符输入流: Writer 抽象类
- 作用:
- 将数据写到文件中
- 构造:
- FileWriter (File file);
- FileWriter (String fileName);
- FileWriter (String fileName,boolean append); 追加,续写
- 方法:
- int write()
- int write(char[] cbuf)
- int write(char[] cbuf,int off ,int len )
- int write(String str)
- void close()
- 小细节
- FileWriter 底层自带一个缓冲区,我们写的数据会先保存到缓冲区中,所以我们需要将缓冲区中的数据刷到文件中
- flush():将缓冲区中的数据刷到文件中,后续流对象还能继续使用
- close():先刷新后关闭,后续流对象不能使用了
- 测试
@Testpublic void demo3() throws IOException {FileWriter fileWriter = new FileWriter("testfile.txt");fileWriter.write("干就完了,兄弟们!\n");fileWriter.write("奥利给\n");fileWriter.flush();fileWriter.close();}