此代码在文件通道中写入两个字符串
final byte[] title = "Title: ".getBytes("UTF-16");
final byte[] body = "This is a string.".getBytes("UTF-16");
ByteBuffer titlebuf = ByteBuffer.wrap(title);
ByteBuffer bodybuf = ByteBuffer.wrap(body);
FileChannel fc = FileChannel.open(p, READ, WRITE, TRUNCATE_EXISTING);
fc.position(title.length); // second string written first, but not relevant to the problem
while (bodybuf.hasRemaining()) fc.write(bodybuf);
fc.position(0);
while (titlebuf.hasRemaining()) fc.write(titlebuf);
每个字符串都以BOM为前缀。
[Title: ?T] *254 255* 0 84 0 105 0 116 0 108 0 101 58 0 32 *254 255* 0 84
虽然可以在文件的开头添加一个,但是当流中间有一个时会产生问题。
如何防止这种情况发生?
答案 0 :(得分:2)
当您使用BOM调用获取UTF-16时插入BOM字节:
final byte[] title = "Title: ".getBytes("UTF-16");
检查title.length,你会发现它包含额外的2个字节用于BOM标记
所以你可以在封装到ByteBuffer之前处理这些数组并从中删除BOM,或者在将ByteBuffer写入文件时可以忽略它
其他解决方案,您可以使用UTF-16 Little / BIG Endianness,它不会写BOM标记:
final byte[] title = "Title: ".getBytes("UTF-16LE");
如果不需要UTF-16,您可以使用UTF-8:
final byte[] title = "Title: ".getBytes("UTF-8");