乱码的根本原因
编码和解码的规则不同
例如:IDEA默认读取文件,编码格式为UTF-8,windows系统文件默认储存格式为GBK,当IDEA读取windows下的文件时,如果不做特殊处理,就可能会出现乱码。
转换流
- InputStreamReader
- OutputStreamWriter
读取文件
可以使用转换流InputStreamReader
来解决乱码问题
IDEA默认编码为UTF-8,读取GBK文件
使用转换流设置读取编码为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
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)
: 创建一个指定字符集的字符流。