3

我有一个 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 字符,缓冲区显示它们都是相同的 - 这肯定是不正确的。

有两个问题困扰着我:

  1. 该文件在文件系统上实际占用多少字节。

  2. 假设它是 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|
4

0 回答 0