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

使用Java无法正确读取二进制文件,java,Java,我有一个二进制文件(实际上是dBF),我想用Java阅读。我正在使用一个FileInputStream和一个BufferedReader,然后通过char[]读取所需的字节 FileInputStream fis; char[] header = new char[32]; try { fis = new FileInputStream(source_url); BufferedReader br; String li

我有一个二进制文件(实际上是dBF),我想用Java阅读。我正在使用一个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);
        ....
问题是我读取到数组中的值并不总是与文件中的值完全相同。例如,值0xE1被读取为0xFD。我尝试了不同的字符集,没有任何更改,将值读取为各种类型的long、int、byte,并使用格式字符串转换为十六进制,在所有情况下都类似于0xFD

<值>是错误的,我可以在C++程序中读取OK,因为它理解未签名的int,并且可以用十六进制文件读取。
我是否使用正确的类来读取二进制数据?我错过什么了吗?我试图避免使用外部库,因为我只是尝试读取应该非常简单的文件。

如果这是一个二进制文件,请不要使用任何类型的
读取器

读取器
获取一个字节序列,并尽力将其解码为字符(这取决于编码)

由于这是一个二进制文件,会有很多字节序列是不可翻译的。因此,您将丢失数据

我可以在C++程序中读取OK,因为它理解无符号的int,并且可以用十六进制文件读取。 这与未签名完全无关。Java的原始整数类型(除了

char
,见下文)是有符号的,是;但它们仍然是零碎的。没有符号位这样的东西

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

要高效读取二进制数据,请使用
文件.newbytechnel()
,或
文件通道.open()
。使用后者,您可以将文件映射到内存中,如果您希望。。。另请参见
文件.readAllBytes()

尤其是如果二进制数据是结构化的,请使用
FileChannel.open()
,因为
FileChannel
实现了
ScatteringByteChannel


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

读取器
获取一个字节序列,并尽力将其解码为字符(这取决于编码)

由于这是一个二进制文件,会有很多字节序列是不可翻译的。因此,您将丢失数据

我可以在C++程序中读取OK,因为它理解无符号的int,并且可以用十六进制文件读取。 这与未签名完全无关。Java的原始整数类型(除了

char
,见下文)是有符号的,是;但它们仍然是零碎的。没有符号位这样的东西

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

要高效读取二进制数据,请使用
文件.newbytechnel()
,或
文件通道.open()
。使用后者,您可以将文件映射到内存中,如果您希望。。。另请参见
文件.readAllBytes()

尤其是如果二进制数据是结构化的,请使用
FileChannel.open()
,因为
FileChannel
实现了
ScatteringByteChannel


如果您正在读取二进制数据,则不希望将其转换为UTF-8

此外,您不需要bufferedReader

试一试


如果您正在读取二进制数据,则不希望将其转换为UTF-8

此外,您不需要bufferedReader

试一试


如果它是一个二进制文件,那么它不是utf,文件中各种完全可以接受的字节序列将被误认为是多字节utf-8字符。名为
XxxxReader
的类用于读取文本。名为
XxxxxInputStream
的类用于读取二进制数据。如果它是二进制文件,则它不是utf,文件中各种完全可接受的字节序列将被误认为是多字节utf-8字符。名为
XxxxReader
的类用于读取文本。名为
XxxxxInputStream
的类用于读取二进制数据。我认为您不需要
InputStreamReader
,但即使如此,您也应该使用另一个读取重载来读取字节数组以提高效率。我错过了这一点-会修复吗?我认为您不需要
InputStreamReader
,但即使如此,您可能也应该使用另一个读取重载来读取字节数组以提高效率。我一直在使用Java6,它似乎没有导入java.nio.file.Files。仍然需要把java认为是负数的东西转换成无符号整数,但我可以接受?那现在呢?你应该尽可能快地跑7点;它现在已经很老了,因为Java8已经超过了堆。我一直在使用Java6,它似乎没有导入java.nio.file.Files。仍然需要把java认为是负数的东西转换成无符号整数,但我可以接受?那现在呢?你应该尽可能快地跑7点;现在它已经很旧了,因为Java8已经过时了
 fis = new FileInputStream(source_url);

 while (br = fis.read () != -1) {
    // save data to byte array
 }