java - 逐字节读取二进制文件

标签 java io binaryfiles

我一直在研究我遇到的一个 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/

相关文章:

c - I/O 多路复用中的写入 block 如何?

java - 从包 swing 导入 xml 文件

java - I/O 操作中 CPU 使用率 100%

variables - 使用 Haskell 从 if 语句获取输入并传递变量

version-control - 在二进制文件中添加 RCS header

c++ - 以编程方式告诉C++中的文件类型

java - 我是 Java 新手 - 表达式开始非法,预期为 '(' 和 ')'

java - 扩大冗长 Activity 序列的最佳方法是什么?

java - 如何使 WebLogic session 超时更加一致

c++ - 输出文件缺少位图文件末尾的填充。为什么是这样?