解决字节流和字符流的乱码问题(转换流)

乱码的根本原因

编码和解码的规则不同

例如:IDEA默认读取文件,编码格式为UTF-8,windows系统文件默认储存格式为GBK,当IDEA读取windows下的文件时,如果不做特殊处理,就可能会出现乱码。

转换流

  • InputStreamReader
  • OutputStreamWriter

读取文件

可以使用转换流InputStreamReader来解决乱码问题
IDEA默认编码为UTF-8,读取GBK文件
解决字节流和字符流的乱码问题(转换流)_第1张图片
使用转换流设置读取编码为GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");

@Test
public void Test3() throws IOException {

	  InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");
	   int read;
	   while((read=isr.read())!=-1){
	       System.out.println((char) read);
	       System.out.println(read);
	   }
	   isr.close();
}

输出结果:
你好
abc
哈哈哈

写入文件

@Test
public void Test6() throws IOException {

    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");
    osw.write("你好");
    osw.write("\r\n");
    osw.write("abc");
    osw.write("\r\n");
    osw.flush();
    osw.write("哈哈哈");
    osw.close();
}

结果:编码格式为GBK


解决字节流和字符流的乱码问题(转换流)_第2张图片



InputStreamReader类

转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

OutputStreamWriter类

转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

你可能感兴趣的:(java基础,乱码,java)