我现在想新建一个文件,然后用UTF-16写内容进去,写完之后发现文本格式是UTF-16BE了。
怎样写完之后还是UTF-16?
public static void writeToFile(List<String> lines, File f)
throws IOException {
System.out.println("writeToFile function started.");
String encoding = "UTF-16";
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter writer = new OutputStreamWriter(fos, encoding);
BufferedWriter bw = new BufferedWriter(writer);
for (String s : lines) {
bw.write(s);
bw.newLine();
}
bw.flush();
writer.flush();
fos.flush();
bw.close();
writer.close();
fos.close();
System.out.println("writeToFile function finished.");
}
------解决方案--------------------
字节顺序标记byte-order mark,BOM,简单来说,就是文件头两字节,用来标记接下来的文件内容是UTF-16BE还是UTF-16LE。即高位在前还是低位在前。UTF-16,在存储的时候必然是BE或LE中的一种。
UTF-16,可以认为是1到2个word组成,1 word =2 byte,
往文件里写的时候,BE就是先存word高位byte,后存低位的byte,LE反之。
你在读取文件的时候要么事先知道文件是BE的还是LE的,然后按正确方式去读一个一个byte。
要么从BOM得知接下来的字节流是BE还是LE,然后去读一个一个byte,当然前提是文件创建者把BOM写入文件了。
http://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E9%A0%86%E5%BA%8F%E8%A8%98%E8%99%9F
------解决方案--------------------
字节序问题,在计算机通讯当中,属于基础概念。
举个简单的例子:
整型数据(int)是4个字节的数据,这个也可以看出是一个定长编码(如果有一个整型数组的话,会更明显一些)。
那么,这个整数,在存储的时候,也会存在,高位字节在前,还是低位字节在前(或者高位bit在前还是低位bit在前)的问题。
当然,我们现在的大部分操作系统和应用程序,都采用的高位在前的处理方式,因为这样便于理解。
但是,也有极少一部分的操作系统和应用程序,采用低位在前的处理方式。
这只局限于整型数据。
图片数据的存储,有的图片文件(格式)中,也会保存一个字节序标识符,用于兼容不同操作系统、应用程序和传输协议。