Java – IO流 – Stream转换流
简介
转换流是指,采用字节流的方式对文本文件进行读取。
我们知道,文本是有字符集的,使用 FileReader 的时候,是没有指定使用那个字符集去读取的,只是我们约定俗成的把文件保存为 UTF-8 编码,而 FileReader 读文本文件的时候也默认使用 UTF-8 进行解码。
但是如果我们遇到的是一个是 GBK 字符集的编码的文本文件时,如果依然使用默认的 UTF-8 解码,会出现乱码。
InputStreamReader 输入转换流(已淘汰)
InputStreamReader 可以提供自定义字符集来读取文本文件,通俗的讲就是,先把文件当作是一个字节流文件(未知字符集文件),然后自定义指定字符集对文件进行解码。
创建InputStreamReader
// 指定使用 GBK 字符集的方式进行解码文件
InputStreamReader isr = new InputStreamReader(new FileInputStream("path"),"GBK");
读取数据
InputStreamReader 在读取数据时,会根据自定义的字符集规则对文件中的数据进行解码,所读取的一个字,并非是一个字节,而是字符集中指定一个字符所表达的字节数量
// 读出一个字符,非读出一个字节
isr.read()
OutputStreamWriter 输出转换流(已淘汰)
OutputStreamWriter 会对内存中将要写出的文本数据,以自定义字符集规则对文件进行写出。如果指定字符集为 GBK,那么内存中的文字数据在写出文件时,将转为 GBK 编码的字节文件。
创建OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("path"),"UTF8");
写出数据
osw.write();
新的输入输出转换流(JDK11)
请参照 FileReader 和 FileWriter 文章
示例:自定义字符集一次读一行
我们知道,
1.FileInputStream() 用于读取文件字节流数据
2.FileReader() 用于读取文本文件中的数据,可以设定指定字符集,但不能直接读取一行
3.InputStreamReader() 能指定字符集
4.BufferedReader() 能一次读取一行
需求:读取一个GBK文本文件,要求一次读一行,使用两种办法进行解决
办法一:使用 FileReader 在JDK11之后提供的自定义字符集构造方法配合BufferedReader进行读行
// 指定一个 GBK 字符集来解码的 FileReader 对象
FileReader fr = new FileReader(new File("path"), Charset.forName("GBK"));
// 使用缓冲流一次读一行
BufferedReader br = new BufferedReader(fr);
br.readLine();
办法二:使用 InputStreamReader() 自定义字符集进行解码文件,再配合 BufferedReader() 一次读一行
// 因为 InputStreamReader 是把文本文件当作字节流使用,所以需要创建一个字节流对象
FileInputStream fis = new FileInputStream(new File("path"));
// 把字节流中的文件以 GBK 字符集的方式解码
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("GBK"));
// 再配合 缓冲流一次读取一行
BufferedReader br = new BufferedReader(isr);
br.readLine();
释放转换流
涉及文件输出的流操作,都应该关闭流文件操作
close();
共有 0 条评论