我有一个 Cp1252 文件,我想将其读取为二进制文件。
ls -al
从终端显示其大小为 10 个字节。
然而,这个 java 片段报告了 18 个字节:
Path path = Paths.get(lfile);
SeekableByteChannel sbc = Files.newByteChannel(path, StandardOpenOption.READ);
long size = sbc.size();
该文件包含 6 个 ascii 字符 + 4 个 Cp1252 字符。我的理解是 10 字节是文件系统上这个文件的正确大小。更多细节:尝试使用以下方式读取文件内容时:
byte[] fileContents = Files.readAllBytes(path);
我得到 18 个字节,因为每个 Cp1252 字符被加载为 3 个字节。在文件中我有不同的 Cp1252 字符,缓冲区显示它们都是相同的 - 这肯定是不正确的。
有两个问题困扰着我:
该文件在文件系统上实际占用多少字节。
假设它是 10 字节长,如何将其读取为“原始”
更新: 我使用一个小型 C 程序尝试了相同的操作,结果与预期一致:从文件中读取了 10 个字符,其中 4 个 Cp1252 的值都不同。
int main() {
char fileName[200] = "test.x10";
FILE *fp = fopen(fileName, "r");
while(1) {
int c = fgetc(fp);
if( feof(fp) )
break ;
printf("%i ", c);
}
fclose(fp);
}
更新 2:
test.x10 包含 Cp1252 字符:aöaäaüaßbb
上面给出的 C 代码打印出来:97 246 97 228 97 252 97 223 98 98
Files.readAllBytes 读取:97 239 191 189 97 239 191 189 97 239 191 189 97 239 191 189 98 98
这是十六进制转储:
hexdump -C test.x10
00000000 61 f6 61 e4 61 fc 61 df 62 62 |a.a.a.a.bb|