我可以在同一个程序中同时使用使用 InputStream 的 Scanner 和 inputstream 本身吗?

Posted

技术标签:

【中文标题】我可以在同一个程序中同时使用使用 InputStream 的 Scanner 和 inputstream 本身吗?【英文标题】:Can I use both Scanner which uses an InputStream and the inputstream itself at the same in the same program? 【发布时间】:2012-02-13 00:53:53 【问题描述】:

我想这是我之前问过的这个问题的输入对应物:

Can I use both PrintWriter and BufferedOutputStream on the same outputstream?

Q1) 我需要从同一个输入流中读取字符串行和字节 []。那么我可以使用扫描仪包装器先读取行,然后直接使用输入流读取字节[]吗?会不会引起冲突?

Q2) 如果没有更多对扫描器对象的引用并且它被垃圾回收,它会自动关闭连接吗?

Q3) 如果第一个问题的答案是肯定的,而第二个问题的答案是否定的,一旦我完成阅读,我只需要调用 inputstream.close() 而不是 Scanner 对吗? (因为到那时我将不再拥有扫描仪对象的句柄)

【问题讨论】:

您也可以使用Scanner 读取字节 ...一次一个。可能不是读取大量字节 IMO 的好选择。更不用说应该明智地使用 Scanner 类,因为它是一个内存猪。 【参考方案1】:

Q1) 是的,扫描器会缓冲其输入,因此当您切换到不同的流时,您想要的一些字节可能已被消耗。

如果您可以使用 Scanner 读取字节,那是一个更好的选择。

Q2) 清理后连接会关闭。

Q3)您只需要关闭输入流,因为 Scanner 是一个纯 Java 对象(和一个输入)对于缓冲输出,您需要调用 flush() 或 close() 以确保发送未写入的数据。

【讨论】:

【参考方案2】:

对于 1),您始终可以读取字节并使用您选择的编码将它们转换为字符串。我很确定这就是所有“读者”的底线。

对于 2),不,Scanner 类不会覆盖 finalize 方法,所以我很确定它不会关闭句柄(它确实不应该)。 Effective Java 一书中关于终结器的部分对此主题有详细的解释。

对于 3),关闭 Scanner 将自动关闭底层流。我很确定这就是几乎所有 I/O 类处理传入的文件/资源​​句柄的方式。

【讨论】:

以上是关于我可以在同一个程序中同时使用使用 InputStream 的 Scanner 和 inputstream 本身吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在同一个程序中同时使用使用 InputStream 的 Scanner 和 inputstream 本身吗?

5sha1加密的一个坑

Delphi中Unicode转中文

是否可以在 React Native 中同时构建多个应用程序?

你可以同时使用 Protractor 和 Appium 来测试混合应用程序吗?

我们可以在 Web 应用程序中同时使用 jQuery 和 AngularJS 吗?