JAVA printStream乱码问题

来源:互联网 发布:缺少mysql.sock 编辑:程序博客网 时间:2024/05/22 12:05

printStream是一个字节流,但是有一个输出字符串的方法,因为之前一直没有注意,今天写一个通信程序的时候出现了乱码,后来发现是这个printSteam.println的问题

即:虽然printSteam可以输出字符串 但是不管这个字符串原来是什么编码 在输出的时候 都会先转化为默认字符编码的字节 再发送!


就是说  假设你操作系统默认编码是gbk 然后你先将一个字符串使用string.getByte("utf-8") 然后再new String(byte[],"utf-8")转化为utf-8编码格式 这个时候你如果使用printSteam.println

那么 这个字符串还是会被解码成gbk后发送

所以如果想不乱码 双方都要使用字符流发送接受 即bufferWriter 和bufferReader 然后指定相同的字符集

另外 在eclipse里启动程序和导出jar包双击启动的默认编码可能不同 这就导致可能在eclipse里程序不会乱码 导出后就会乱码 所以最好就是使用字符流 不要使用字节流来发送字符串


实例代码

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class printTest {

    public printTest() throws IOException
    {
        //使用两种方式输出 会得到不同的字符编码
        
        
        String line="哈哈哈";
        //改为gbk编码
        byte[] bs=line.getBytes("GBK");
        line=new String(bs,"GBK");
        
        File file=new File("test1.txt");
        file.createNewFile();
        PrintStream printStream=new PrintStream(new FileOutputStream(file));
        printStream.println(line);
        
        File file2=new File("test2.txt");
        file2.createNewFile();
        FileOutputStream fileOutputStream=new FileOutputStream(file2);
        fileOutputStream.write(bs);
        
        
        
    }
}

文件1直接输出字符串

文件2输出字节

可以看到 无论将字符编码改成什么 使用16进制查看器就会发现 其内容都没有变

而文件2内容则随着字符编码改变而改变 这证实了printSteam在输出字符串的时候确实是对字符串进行了重新解码成默认编码



0 0