我可以在同一个程序中同时使用使用 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 本身吗?
是否可以在 React Native 中同时构建多个应用程序?