我是否可以在同一程序中使用同时使用InputStream的Scanner和输入流本身?

时间:2012-01-18 09:29:28

标签: java sockets input inputstream

我想这是这个问题的输入对应部分,我问了一些时间:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

对于1),您始终可以使用您选择的编码读取字节并将其转换为String。我很确定这是所有读者和#34;在引擎盖下。

对于2),不,Scanner课程不会覆盖finalize方法,所以我非常确定它不会关闭句柄(它真的不应该&# #39; T)。有效Java书中关于终结器的部分有关于该主题的详细说明。

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

答案 1 :(得分:1)

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

如果您可以使用扫描仪读取字节,那么这是一个更好的选择。

Q2)连接将在清理时关闭。

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