Java 从单字节文件读取返回0xEF 0xBF 0xBD
解决了,接受了下面的答案,因为它指出我要检查我的文件是如何损坏的。出于Maven的原因,请阅读此问题的结尾 我创建了一个1字节的文件,其中包含字节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
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();