二进制文件无法正确读取Java

Rob*_*ave 0 java

我想用Java阅读一个二进制文件(实际上是一个dBF).我正在使用FileInputStream和BufferedReader,然后将所需的字节读取为char [].

    FileInputStream fis;

    char[] header = new char[32];

    try {
        fis = new FileInputStream(source_url);

        BufferedReader br;
        String line;

        br = new BufferedReader(new InputStreamReader(fis, Charset.forName("UTF-8")));
        br.read(header);
        ....
Run Code Online (Sandbox Code Playgroud)

问题是我读入数组的值并不总是与文件中的值完全相同.例如,值0xE1读为0xFD.我尝试了不同的字符集,没有更改,并将值读取为各种类型long,int,byte,并使用格式字符串到十六进制,在所有情况下,它看起来像0xFD.

这些值是definatley错误的,我可以在C++程序中读取正常,因为它理解无符号整数,并且可以读取hex fileviewer.

我使用正确的类来读取二进制数据吗?我错过了什么吗?我试图避免使用外部库,因为我只是想读取应该非常简单的文件.

fge*_*fge 5

如果这是二进制文件,请不要使用Reader任何类型的文件.

A Reader采用一系列字节并尝试将其解码为字符,以达到其最佳能力(这取决于编码).

由于这是一个二进制文件,因此会有许多字节序列无法翻译.结果,你会丢失数据......

我可以在C++程序中读取正常,因为它理解无符号整数,并且可以在hex文件查看器中读取.

这与无符号无关.Java的原始整数类型(除了char,见下文)是签名的,是的; 但它们仍然是有点的.没有签名位这样的东西.

请注意,在Java中,a char不是a byte.它是一个16位无符号整数,专门用于存放字符.

要有效地读取二进制数据,请使用Files.newByteChannel()FileChannel.open().使用后者,您可以将文件映射到内存中,如果您希望...另请参阅Files.readAllBytes().

特别是如果您的二进制数据是结构化的,请使用FileChannel.open()FileChannel实现ScatteringByteChannel.

强制性链接 < - 保持开放并阅读您需要的内容:)此答案中的所有类名都记录在那里.