清空输入流:Java

4
有没有一种方法可以在关闭输入流之前刷新Java中的输入流?与迭代调用以下语句相关,同时读取磁盘上的多个文件。
InputStream fileStream = item.openStream();
fileStream.close;

4
清空输入流会做什么? - Brendan Long
你能解释一下你的意思吗?刷新OutputStream是有道理的,因为可能还有一些缓冲数据需要发送。但是刷新InputStream应该做什么呢? - Wouter Coekaerts
你是否希望重复使用InputStream?如果是这样,为每个要处理的文件创建一个新的InputStream可能是更好的选择。 - James P.
2个回答

13

InputStream 不能被刷新。为什么您要这样做呢?OutputStream 可以被刷新,因为它实现了接口 Flushable。刷新只有在写入数据时才有意义(以强制刷新缓冲区中的数据)。请参阅Flushable 的文档了解所有实现类。


1

这是一个老问题,但似乎是唯一的一个类似问题,我认为"刷新"输入流有一个有效的用例。

在Java中,如果你正在使用BufferedReader或BufferedInputStream(我相信这是一个常见情况),"刷新"流可以被视为丢弃缓冲区中的所有数据,即刷新缓冲区。

举个例子,考虑实现一个类似Python的编程语言的REPL。

在这种情况下,你可能会在System.in上使用BufferedReader。用户输入一个(可能很大)表达式并按下回车键。此时,表达式(或其中的一部分)存储在读取器的缓冲区中。

现在,如果表达式中的某个地方发生语法错误,它将被捕获并显示给用户。然而,表达式的其余部分仍然驻留在输入缓冲区中。

当REPL循环继续时,它将从语法错误发生的位置开始读取,在某个错误表达式的中间。这很可能是不可取的。相反,最好只是丢弃缓冲区的剩余部分,并继续进行"全新的开始"。

在这种意义上,我们可以使用BufferedReader的API方法ready()来丢弃任何剩余的缓冲字符。文档中写道:

"

判断此流是否可以被读取。如果缓冲区不为空或底层字符流已准备好,则缓冲字符流已准备好。

然后我们可以定义一个“刷新”BufferedReader的方法:

"
void flush(BufferedReader input) throws IOException
{
  while (input.ready())
    input.read();
}

这个函数会简单地丢弃所有剩余的数据,直到缓冲区为空。在处理语法错误后(通过向用户显示),我们调用flush()。当REPL循环恢复时,您将获得一个空缓冲区,因此不会因为缓冲区中留下的“垃圾”而得到一堆无意义的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接