有没有办法在Java中刷新输入流,可能在关闭之前?和---关联 迭代地调用下面的语句,同时读取磁盘上的几个文件
InputStream fileStream = item.openStream();
fileStream.close;
答案 0 :(得分:11)
InputStream
无法刷新。你为什么要这样做?
OutputStream
可以在实现接口Flushable
时刷新。 Flushing使IMHO仅在写入数据的情况下有意义(强制写入缓冲数据)。有关所有实施课程,请参阅Flushable
的{{3}}。
答案 1 :(得分:0)
这是一个老问题,但似乎是同类问题中唯一的一个,我认为“刷新”输入流有一个有效的用例。
在 Java 中,如果您使用的是 BufferedReader 或 BufferedInputStream(我认为这是一种常见情况),则可以认为“刷新”流相当于丢弃当前缓冲区中的所有数据——即刷新缓冲区.
有关何时这可能有用的示例,请考虑为 Python 或类似语言等编程语言实现 REPL。
在这种情况下,您可以在 System.in 上使用 BufferedReader。用户输入一个(可能很大)表达式并按回车键。此时,表达式(或其中的一部分)存储在您的 Reader 的缓冲区中。
现在,如果表达式中的某处出现语法错误,它将被捕获并显示给用户。但是,表达式的其余部分仍驻留在输入缓冲区中。
当 REPL 循环继续时,它将开始读取超出语法错误发生点的位置,在某些错误表达式的中间。这可能是不可取的。相反,最好简单地丢弃缓冲区的其余部分并继续“重新开始”。
在这个意义上,我们可以使用 BufferedReader API 方法 ready() 来丢弃任何剩余的缓冲字符。文档内容如下:
“告诉这个流是否准备好被读取。如果缓冲区不为空,或者底层字符流准备好,则缓冲的字符流准备好。”
然后我们可以定义一个方法来“刷新”BufferedReader:
void flush(BufferedReader input) throws IOException
{
while (input.ready())
input.read();
}
简单地丢弃所有剩余数据,直到缓冲区为空。然后我们在处理语法错误后调用flush()(通过向用户显示)。当 REPL 循环恢复时,您有一个空缓冲区,因此不会因缓冲区中留下的“垃圾”而导致一堆无意义的错误。