转换流的意义
当代码编码和文件编码不一致时,如果使用字符流读取时会出现乱码的问题,而转换流可以解决这个问题。
如何解决乱码问题
- 使用字符输入转换流
- 可以提取文件(GBK)的原始字节流,原始字节不会存在问题
- 然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
InputStreamReader(字符输入转换流)
可以把原始的字节流按照编码转换成字符输入流
构造器
public InputStreamReader(InputStream is) :可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,意义不大
public InputStreamReader(InputStream is,String charset):可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)
代码编写
try (
BufferedReader reader = new BufferedReader (new InputStreamReader (new FileInputStream ("D:\\Users\\cczyan\\Desktop\\JavaStudy\\txt01.txt"), "GBK"));
) {
String line;
while ((line = reader.readLine ()) != null) {
System.out.println (line);
}
} catch (Exception e) {
e.printStackTrace ();
}
OutputStreamWriter:字符输出转换流
把直接输出流按照指定编码转换成字符输出流
构造器
- public OutputStreamWriter(OutputStream os):可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用
- public OutputStreamWriter(OutputStream os ,String charset):可以把原始的字节输出流按照指定编码转换成字符输出流(重点)
代码实现
try (
BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (“D:\Users\cczyan\Desktop\JavaStudy\txt01.txt”), “GBK”));
) {
bufferedWriter.write (“我是GBK编码哦”);
bufferedWriter.newLine ();
bufferedWriter.write (“我是重复的”);
} catch (Exception e) {
e.printStackTrace ();
}
实例
通过读取一个文件并将其内容以该文件的编码格式复制到另外一个文件
try (
BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (new FileInputStream ("D:\\Users\\cczyan\\Desktop\\JavaStudy\\txt01.txt"), "GBK"));
BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (new FileOutputStream ("D:\\Users\\cczyan\\Desktop\\JavaStudy\\txt02.txt"), "GBK"))
) {
String line;
while ((line=bufferedReader.readLine ())!=null){
bufferedWriter.write (line);
bufferedWriter.newLine ();
System.out.println (line);
}
} catch (Exception e) {
e.printStackTrace ();
}