我这里写了一个例子,把字符串”我是好人”,以unicode编码写入到文本中,用InputStreamReader以”UTF-16LE”编码读取,输出的结果为:“???絙?”,而以“UTF-16BE”编码读取,结果则是“?我是好人”,文件大小显示为10字节。我的理解是,如果程序中指定使用unicode编码,但是没有指定字节顺序,程序会用java默认的UTF-16BE进行编码,并且,会输出标志位FEFF。所以文件中多了两个字节。而读取的时候,使用unicode编码读取,程序不知道使用的是哪一种字节顺序,先读取开头的FEFF,结果表明是采用的UTF-16BE编码,接下来再继续解析,就得到正确字符。而如果指定使用UTF-16LE编码,因为已经包含了字节顺序,所以就直接从字节数组中读取形成字符串,就出现了五个字符,而且由于编码格式不一样,除了‘好‘和‘絙’的编码刚好高低位倒置,还可以形成字符,其余全都是乱码。而使用UTF-16BE编码读取,因为已经制定了字节顺序,所以,也就不去读取标志位,那么就把unicode中无法编码的FEFF解码成为了‘?’。