gpt4 book ai didi

Java 字符集InputStreamReader、文件 channel 差异

转载 作者:行者123 更新时间:2023-11-30 04:34:00 26 4
gpt4 key购买 nike

我正在尝试读取编码为 UTF-16 文件的(日语)文件。

当我使用字符集为“UTF-16”的 InputStreamReader 读取它时,文件被正确读取:

try {
InputStreamReader read = new InputStreamReader(new FileInputStream("JapanTest.txt"), "UTF-16");
BufferedReader in = new BufferedReader(read);
String str;
while((str=in.readLine())!=null){
System.out.println(str);
}
in.close();
}catch (Exception e){
System.out.println(e);
}

但是,当我使用文件 channel 并从字节数组读取时,字符串并不总是正确转换:

    File f = new File("JapanTest.txt");
fis = new FileInputStream(f);
channel = fis.getChannel();
MappedByteBuffer buffer = channel.map( FileChannel.MapMode.READ_ONLY, 0L, channel.size());
buffer.position(0);
int get = Math.min(buffer.remaining(), 1024);
byte[] barray = new byte[1024];
buffer.get(barray, 0, get);
CharSet charSet = Charset.forName("UTF-16");
//endOfLinePos is a calculated value and defines the number of bytes to read
rowString = new String(barray, 0, endOfLinePos, charSet);
System.out.println(rowString);

我发现的问题是,如果 MappedByteBuffer 位于位置 0,我只能正确读取字符。如果我增加 MappedByteBuffer 的位置,然后将多个字节读入字节数组,然后将其转换为使用字符集 UTF-16 的字符串,则字节转换不正确。如果文件以 UTF-8 编码,我没有遇到过这个问题,那么这只是 UTF-16 的问题吗?

更多详情:我需要能够从文件 channel 读取任何行,因此为此我构建了行结束字节位置的列表,然后使用这些位置能够获取任何给定行的字节,然后将它们转换为字符串.

最佳答案

UTF-16的编码单位是2个字节,而不是像UTF-8那样一个字节。模式和单字节编码单元长度使UTF-8自同步;它可以在任何点正确读取,如果它是连续字节,它可以回溯或仅丢失一个字符。

使用 UTF-16,您必须始终使用字节对,不能从奇数字节开始读取或从奇数字节停止读取。您还必须知道字节顺序,并且在不读取文件开头时使用 UTF-16LE 或 UTF-16BE,因为不会有 BOM。

您还可以将文件编码为 UTF-8。

关于Java 字符集InputStreamReader、文件 channel 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13927082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com