我一直在研究我遇到的一个 Java 问题,但没有成功。我在 StackOverflow 上阅读了一大堆类似的问题,但解决方案似乎并没有按预期工作。
我正在尝试逐字节读取二进制文件。
我用过:
while ((data = inputStream.read()) != -1)
循环...
for (int i = 0; i < bFile.length; i++) {
循环...
但我只得到空的或空白的输出。我试图读取的文件的实际内容如下:
¬í sr assignment6.PetI¿Z8kyQŸ I ageD weightL namet Ljava/lang/String;xp > @4 t andysq ~ @bÀ t simbasq ~ @I t wolletjiesq ~
@$ t rakker
我只是试图逐字节读取它,并使用以下行将其提供给字符数组:
char[] charArray = Character.toChars(byteValue);
这里的 Bytevalue 表示它正在读取的字节的 int。
哪里出了问题?
最佳答案
自 java 7 起不再需要逐字节读取,Files 中有两个实用函数:
Path path = Paths.get("C:/temp/test.txt");
// Load as binary:
byte[] bytes = Files.readAllBytes(path);
String asText = new String(bytes, StandardCharset.ISO_8859_1);
// Load as text, with some Charset:
List<String> lines = Files.readAllLines(path, StandardCharsets.ISO_8859_1);
如果您想读取二进制数据,可以使用 readAllBytes
。
字符串和字符用于文本。与许多其他编程语言相反,这意味着 Unicode,因此可以组合世界上所有的脚本。 char
是 16 位,而不是 8 位 byte
。
对于纯 ASCII,Unicode/UTF-8 的 7 位子集,byte 和 char 值是相同的。
那么你可能做了以下(低质量代码):
int fileLength = (int) path.size();
char[] chars = new char[fileLength];
int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
chars[i] = (char) data; // data actually being a byte
++i;
}
inputStream.close();
String text = new String(chars);
System.out.println(Arrays.toString(chars));
您遇到的问题可能与 java 中笨重的固定大小数组有关,并且 char[]
仍然不是 String
。
对于二进制用法,因为您似乎正在读取序列化数据,您可能希望转储文件:
int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
char ch = 32 <= data && data < 127 ? (char) data : ' ';
System.out.println("[%06d] %02x %c%n", i, data, ch);
++i;
}
转储文件位置、十六进制值和字符值。
关于java - 逐字节读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25378938/