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在输出字符串的时候确实是对字符串进行了重新解码成默认编码