解决了,接受了以下答案,因为它指出我检查我的文件是如何损坏的。请阅读Maven理由的结尾。
我创建了一个包含字节0xA8
的1字节文件。我试图将它读入任何允许我稍后使用它的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
文件是我使用十六进制编辑器自己创建的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.hex
文件被Maven过滤,输入了替换字符(0xEF 0xBF 0xBD),其中0xA8
曾经是。pom.xml
。我现在将<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.hex</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.hex</include>
</includes>
</resource>
</resources>
<!-- ... -->
</build>
更新为以下内容:
{{1}}
答案 0 :(得分:1)
您的文件似乎有替换字符http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec
U+FFFD � 239 191 189 REPLACEMENT CHARACTER
不是0xA8
,我确实使用以下代码创建了一个简单文件
File f = new File("0xA8.hex");
FileOutputStream stream = new FileOutputStream(f);
stream.write(0xA8);
stream.flush();
stream.close();
注意**仅适用于演示
并使用您的程序读取它正在作为例外工作。找出文件是如何损坏的。