Java 从单字节文件读取返回0xEF 0xBF 0xBD

Java 从单字节文件读取返回0xEF 0xBF 0xBD,java,byte,fileinputstream,Java,Byte,Fileinputstream,解决了,接受了下面的答案,因为它指出我要检查我的文件是如何损坏的。出于Maven的原因,请阅读此问题的结尾 我创建了一个1字节的文件,其中包含字节0xA8。我试图将它读入任何Java结构中,以便以后使用它。我知道java中的字节是有符号的,所以从0x80到0xFF的任何值都将被解释为负数 import java.io.DataInputStream; import java.io.EOFException; import java.io.File; import java.io.FileInpu

解决了,接受了下面的答案,因为它指出我要检查我的文件是如何损坏的。出于Maven的原因,请阅读此问题的结尾

我创建了一个1字节的文件,其中包含字节
0xA8
。我试图将它读入任何Java结构中,以便以后使用它。我知道java中的字节是有符号的,所以从
0x80
0xFF
的任何值都将被解释为负数

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void main(final String[] args) throws IOException {
        // 0xA8.hex contains one byte 0xA8.
        final File inputFile = new File(Test.class.getClassLoader().getResource("0xA8.hex").getPath());
        final FileInputStream fin = new FileInputStream(inputFile);
        final DataInputStream dis = new DataInputStream(fin);
        int read = dis.readUnsignedByte();
        System.out.println(read + ", hex: " + Integer.toHexString(read));

        while (true) {
            try {
                read = dis.readUnsignedByte();
                System.out.println("read more: " + read + ", hex: " + Integer.toHexString(read));
            } catch (final EOFException ignored) {
                break;
            }
        }
    }
}
也许我遗漏了一些非常简单的东西,但我不能把我的头放在它上面。。上述程序输出:

239, hex: ef
read more: 191, hex: bf
read more: 189, hex: bd
0xA8.hex
文件是我自己使用hex编辑器创建的一个1字节文件。它的内容实际上是一个字节:

drvdijk@macmine:~/$ hexdump 0xA8.hex 
0000000 a8                                             
0000001
为什么,我如何使它只读取一个字节(可能转换为无符号字节)

解决方案 我使用Maven,在
pom.xml
中有一节:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <!-- ... -->
</build>

您的文件似乎具有替换字符

不是
0xA8
,而是使用以下代码创建了一个简单的文件

File f = new File("0xA8.hex");
        FileOutputStream stream = new FileOutputStream(f);
        stream.write(0xA8);
        stream.flush();
        stream.close();
注**仅用于演示


并使用您的程序来读取它,它作为例外工作。查找文件是如何损坏的。

第一个字节似乎是文件的BOM表头()。用Hexeditor打开你的文件,你会看到它。那真的是二进制文件吗?字节首先是如何写入的?注释
//0xA8.hex包含一个字节0xA8。
是错误的。您的文件不包含0xA8的一个字节-您需要证明它包含。谢谢各位,但是
0xA8.hex
文件是我自己使用十六进制编辑器创建的文件,它实际上只包含一个字节。相应地更新了问题。这是一个人为的例子(我编写了这个代码,并验证了它的输出是否符合这个问题),在现实生活中,我试图阅读一些专有的little endian文件格式。我刚刚尝试了这个程序,它显示了预期的输出:
168,hex:a8
。哇,你说得对!我想我正在读的文件不是我正在读的文件!代码中的
Test.class.getClassLoader().getResource(“0xA8.hex”).getPath()
并没有指向我使用文本编辑器创建的文件,而是指向Maven筛选的测试资源。再一次,哇。
U+FFFD  �   239 191 189 REPLACEMENT CHARACTER
File f = new File("0xA8.hex");
        FileOutputStream stream = new FileOutputStream(f);
        stream.write(0xA8);
        stream.flush();
        stream.close();