0

我有一个文件,我的 Java 应用程序将其作为输入,我一次读取 6 个字节。当我从文件系统中读取它时,一切正常。如果我将所有内容构建到一个 jar 中,则第一个 4868 读取工作正常,但之后它开始以错误的顺序返回字节数组,并且最后还读取了更多数据。

这是我的代码的简化版本,它重现了该问题:

     InputStream inputStream = this.getClass().getResourceAsStream(filePath);
     byte[] byteArray = new byte[6];
     int counter = 0;
     while ((inputStream.read(byteArray) != -1))
     {
        counter++;
        System.out.println("Read #" + counter +": " + Arrays.toString(byteArray));
     }
     System.out.println("Done.");

这是我在读取文件系统时得到的 [缩写] 输出:

...
Read #4867: [5, 0, 57, 7, 113, -26]
Read #4868: [2, 0, 62, 7, 114, -26]
Read #4869: [2, 0, 68, 7, 115, -26]
Read #4870: [3, 0, 75, 7, 116, -26]
Read #4871: [2, 0, 83, 7, 117, -26]
...
Read #219687: [1, 0, 4, -8, 67, 33]
Read #219688: [1, 0, 2, -8, 68, 33]
Read #219689: [5, 0, 1, -8, 67, 33]
Done.

这是我从一个罐子里读到的:

...
Read #4867: [5, 0, 57, 7, 113, -26]
Read #4868: [2, 0, 62, 7, 113, -26] //everything is fine up to this point
Read #4869: [7, 114, -26, 2, 0, 68]
Read #4870: [7, 115, -26, 3, 0, 75]
Read #4871: [7, 116, -26, 2, 0, 83]
...
Read #219687: [95, 33, 1, 0, 78, -8]
Read #219688: [94, 33, 1, 0, 76, -8]
Read #219689: [95, 33, 1, 0, 74, -8]
...
Read #219723: [67, 33, 1, 0, 2, -8]
Read #219724: [68, 33, 5, 0, 1, -8]
Read #219725: [67, 33, 5, 0, 1, -8]
Done.

我解压 jar 并确认正在读取的文件是相同的,那么什么会导致阅读器返回不同的结果呢?

4

1 回答 1

2

你的阅读循环是错误的。 方法返回它真正读取inputStream.read()的字节数。在将数据转换为字符串之前,您必须检查此数字。

当您从文件中读取时,字节并没有一起到达。在循环的其中一次迭代中,您可能读取了预期的 6 个字节中的 4 个,因此您对字符串的转换不起作用。如果您正在阅读整数,我建议您使用Scanneror good old包装原始输入字符串DataInputStream并直接读取整数。

于 2012-10-24T16:41:01.160 回答