目录
2.2.1 Reader 的具体实现子类 - FileReader
2.2.2 Writer 的具体实现子类 - FileWriter
2.2.3 带缓存的FileReader - BufferedReader
2.2.4 带缓存的FileWriter - BufferedWriter
2.2.5 用InputStreamReader和OutputStreamWriter解决编码问题
2.2 字符流
字符流主要是对文本文件操作,其内置了编码转化的功能,在处理纯文本的文件方面比较有优势。英文的编码是一个字节,而中文的编码在GBK里是两个字节,那么若一个文件中是中英混杂,会出现乱码。而用字符流处理这样的文本较于字节流会更加方便。
使用场景:
- 读取字符并修改字符
- 不建议用于文件的拷贝
- 不能读取非纯文本文件,如音频,视频等
字符流的两个抽象类为Reader和Writer。
2.2.1 Reader 的具体实现子类 - FileReader
- 构造方法
2. 常用方法
- int read() - 返回读取的一个字符
- int read(char[] c) - 将读取c.length()大小的字符数组
- int read(char[] c, int offset, int length) - 将读取一部分到字符数组中
- boolean ready( )
2.2.2 Writer 的具体实现子类 - FileWriter
- 构造方法
2. 常用方法
- void write(int c) - 写入一个字符
- void write(String str, int off, int length) - 写入字符串的一部分
- void write(char[] cbuf, int off, int length) - 写入字符数组的一部分
- String getEncode() - 获取当前编码方式
2.2.3 带缓存的FileReader - BufferedReader
由于BufferedReader用法与FileReader类似,其设计模式与FileInputStream类似,故不赘述。其新增的方法有:
- String readLine() - 读取文本文件一行,返回一串字符串
2.2.4 带缓存的FileWriter - BufferedWriter
由于BufferedWriter用法与FileWriter类似,其设计模式与FileOutputStream类似,故不赘述。其新增的方法有
- void newLine() - 写一行行分隔符。 行分隔符字符串由系统属性line.separator定义,并不一定是单个换行符('\ n')字符。
2.2.5 用InputStreamReader和OutputStreamWriter解决编码问题
- InputStreamReader
InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset
将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
每个调用InputStreamReader的read()方法之一可能会导致从底层字节输入流读取一个或多个字节。 为了使字节有效地转换为字符,可以从底层流读取比满足当前读取操作所需的更多字节。
为了最大的效率,请考虑在BufferedReader中包装一个InputStreamReader。如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
构造方法:
2.OutputStreamWriter
OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset
。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
每次调用write()方法都会使编码转换器在给定字符上被调用。 所得到的字节在写入底层输出流之前累积在缓冲区中。 可以指定此缓冲区的大小,但是默认情况下它大部分用于大多数目的。 请注意,传递给write()方法的字符不会缓冲。
构造方法:
3. 解决编码问题
用字节流读取UTF-8的文件,传入InputStreamReader转成字符流,在包装在BufferedReader里,再用OutputStreamWriter和BufferedWriter写成编码为GBK的文件
public static void main(String[] args) throws IOException {
String PYFILE = "D:\\PyQt5Project\\opencv_vcom\\myopencv\\coindetection.py";
FileInputStream finput = new FileInputStream(PYFILE);
BufferedReader br = new BufferedReader(new InputStreamReader(finput, "UTF-8"));
FileOutputStream foutput = new FileOutputStream("coindetection.py");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(foutput, "GBK"));
String content = "";
while((content = br.readLine()) != null) {
bw.write(content);
bw.newLine();
System.out.println(content);
}
bw.close();
}