前提
我是在 Java 中使用 steam 的新手,我发现我的问题至少与以前提出的问题不同。这是我此时的代码片段(该代码更多的是概念证明):
try {
//file is initialized to the path contained in the command-line args.
File file = new File(args[0]);
inputStream = new FileInputStream(file);
byte[] byteArray = new byte[(int)file.length()];
int offset = 0;
while (inputStream.read(byteArray, offset, byteArray.length - offset) != -1) {
for (int i = 0; i < byteArray.length; i++) {
if (byteArray[offset + i] >=32 && byteArray[offset + i] <= 126) {
System.out.print("#");
} else {
System.out.print("@");
}
//offset = byteArray.length - offset;
}
}
目标
这是我的目标:创建一个仅读取 80 个字节输入的程序(该数字是任意的 - 让它为x),决定该段中的每个字节是否代表 ASCII 字符,并相应地打印。 代码的最后两部分对于所有意图和目的来说都是“正确的”:因为代码已经适本地做出了确定并相应地打印 - 这不是我的问题的前提。
假设 file
的 length()
大于 80 个字节,并且我希望(一次只读取 80 个字节的输入)到达 EOF ,即输入文件的全部内容。打印到控制台的每一行只能包含 80 - 或 x 字节的内容。 我知道调整偏移并且一直在修改它;然而,当我到达 EOF 时,我不想编程崩溃并燃烧 - 可以这么说,“爆炸”。
问题
遇到EOF时,如何确保捕获的字节仍然被读取并且for
循环中的代码仍然被执行?
例如,将上面的inputStream.read()
更改为:
inputStream.read(byteArray, offset, 80)
如果在读取文件中的最后一个字节时遇到文件结尾 (EOF),这将“轰炸”。例如,如果我尝试读取 80 个字节,但只剩下 10 个字节。
最佳答案
read的返回值告诉您已读取的字节数。这将是 <= length
的值。仅仅因为文件大于 length
并不意味着对 length
字节数的请求实际上会导致那么多字节被读入您的 byte[]
。
当返回-1
时,确实表示EOF。它还表明没有数据读入您的 byte[]
。
关于java - 读取(字节[] b,int关闭,int len): Reading A File To Its End,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398368/