Inputstream 的末尾是否有 -1?

问题描述

我对编程很陌生。

在阅读 Oracle Java 教程“Basic I/O”中的文章 Byte Streams 时,我遇到了以下代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

我不明白 while 循环的条件。 -1 是消息结束的某种迹象吗? FileOutputStream 是否在最后添加?

感谢大家的关注。我希望你有一个美妙的西尔维斯特。

解决方法

要补充其他答案,解决这个问题的工具是 the documentation

对于 FileInputStream 的“读取”方法:

public int read()
抛出 IOException

从此输入流中读取一个字节的数据。如果尚无可用输入,则此方法会阻塞。指定者: 在类 InputStream 中读取

返回:数据的下一个字节,如果 已到达文件末尾。

这是确定的。

所有标准 Java 类都以这种方式记录。在不确定的情况下,快速检查会让您放心。

,

编辑:“在输入期间意外到达文件结尾或流结尾的信号。 此异常主要用于数据输入流,它通常需要特定格式的二进制文件,并且流结束是异常情况。大多数其他输入流在流结束时返回一个特殊值。"

正确的方法是捕获 EOFException 以找出文件是否结束,但在这种情况下,将字符读取为 EOF -1 is returned 而不是 null,它可以工作,因为负 ascii 没有字符,检查 while ((c = in.read()) >= 0) {} 是一样的,所以你可以使用 != -1,它会工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...