【问题标题】:Is there an -1 at the end of an Inputstream?Inputstream 的末尾是否有 -1?
【发布时间】:2020-12-30 16:15:51
【问题描述】:

我对编程很陌生。

在阅读 Oracle Java 教程 中“基本 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 是否加在最后?

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

【问题讨论】:

  • docs — “-1 如果到达流的末尾”
  • 顺便问一下,什么是“西尔维斯特”?这在英语中并不常见。也许是“新年”?
  • @aguest 一年中的最后一天,拼写为 Silvester。
  • 是的,我的意思是新年。它在我的母语中是“Silvester”,我认为它在英语中是一样的,因为它是一个圣人的名字,而且不同语言之间的名字变化不大。
  • 令我惊讶的是,以色列的(世俗)除夕也是“西尔维斯特节”。显然他的生日是 12 月 31 日。

标签: java fileinputstream fileoutputstream


【解决方案1】:

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

对于 FileInputStream 的 'read' 方法:

公共 int 读取()
抛出 IOException

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

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

这是确定的。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 没有EOFException 抛出来捕捉。
    • 如果你写while(true) { in.read() },在eof之后你会有异常...你不同意吗?
    • 它没有,它只是返回-1
    • 从输入流中读取的是字节,而不是 ASCII 字符。
    • @DeviKhositashvili 它将不断返回-1 以指示文件结束,但不会抛出EOFException
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 2011-01-17
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多