【问题标题】:Closing BufferedReader and System.in关闭 BufferedReader 和 System.in
【发布时间】:2012-01-02 11:45:11
【问题描述】:
Reader rdr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(rdr);
String s;
s = br.readLine();
br.close();
Scanner sc = new Scanner(System.in);
s = sc.nextLine();
System.out.print(s);

我注意到如果我关闭BufferedReader,我将无法再从键盘插入输入,因为System.in 以某种方式关闭。无论如何我可以保留br.close()(我需要它来删除文件)然后从键盘添加更多输入?

【问题讨论】:

  • 删除什么文件? BufferedReaders 旨在绑定到特定的输入流。关闭它们后,您将无法重复使用它们。
  • 真的不需要关闭br来删除文件。
  • 如果您正在从文件中读取,并在某个时间点使用BufferedReader,然后关闭BufferedReader,然后从文件流中读取更多内容,您将错过一些字节。这些字节被缓冲的阅读器消耗(为了缓冲)。你需要找到另一种方法。为什么需要从 Reader 子类转到 Scanner?一些api限制?在任何一种情况下,您都可以做不同的事情,例如使用RandomAccessFile 和/或也可以做 Reader 事情的自定义 Scanner 子类。
  • 这是我正在使用 BufferedReader 读取的文件。然后我需要删除它。如果我不关闭 BufferedReader,我将无法删除文件(file.delete() 返回 false)。

标签: java input bufferedreader system.in


【解决方案1】:

如果您只想通过 System.in 从键盘获取输入,请使用静态 BufferedReader 包装 InputStreamReader(也包装 System.in)。 像这样:

 Public BufferedReader is = new BufferedReader(new InputStreamReader(System.in));

还有is.close();在您的应用程序终止之前需要。

【讨论】:

    【解决方案2】:

    看起来你需要:

    http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

    在制作你的阅读器之前将它包裹在 System.in 周围,然后一切都会好起来的,因为当你使用 FileInputStream 时你不会这样做。

    【讨论】:

    • 你说'new CloseShieldInputStream(System.in)'
    • 谢谢。我最终使用了一种解决方法,我没有删除该文件,我只是用正确的信息重新编写了它:)
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2023-04-05
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2013-06-15
    相关资源
    最近更新 更多