我有一个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:
hexdump -C test.x10
00000000 61 f6 61 e4 61 fc 61 df 62 62 |a.a.a.a.bb|