日期:2014-05-20  浏览次数:20906 次

Java UTF-16格式写文件
我现在想新建一个文件,然后用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.");
}



------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

标准 charset

Java 平台的每一种实现都需要支持以下标准 charset。请参考该实现的版本文档,查看是否支持其他 charset。这些可选 charset 的行为在不同的实现之间可能有所不同。

Charset

描述

US-ASCII 7 位 ASCII 字符,也叫作 ISO646-US、Unicode 字符集的基本拉丁块
ISO-8859-1   ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1
UTF-8 8 位 UCS 转换格式
UTF-16BE 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序
UTF-16LE 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序
UTF-16 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识

http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/nio/charset/Charset.html
这意思我写文件不管怎样都不能使UTF-16格式的了??我的意思就是用ultraedit看的时候不可能是UTF-16了??


问你一句,这里红色这句,你确实理解了吗? 确实理解了的话,应该你就不会有你最初的问题。


麻烦解释下,我真不懂。。。


字节顺序标记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在前)的问题。
当然,我们现在的大部分操作系统和应用程序,都采用的高位在前的处理方式,因为这样便于理解。
但是,也有极少一部分的操作系统和应用程序,采用低位在前的处理方式。
这只局限于整型数据。

图片数据的存储,有的图片文件(格式)中,也会保存一个字节序标识符,用于兼容不同操作系统、应用程序和传输协议。