请参阅以下代码:
s = new Socket(nextHopIP, 3434);
fileIn = new FileInputStream(fileName);
fileOut = s.getOutputStream();
buffer = new byte[bufferSize];
pw = new PrintWriter(s.getOutputStream());
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw.println(fromIP);
pw.println(toIP);
pw.println(fileName.split("\\\\")[fileName.split("\\\\").length - 1]);
pw.flush();
//Send file
fileTransferTime = System.currentTimeMillis();
while((readFile = fileIn.read(buffer)) != -1) {
fileOut.write(buffer, 0, readFile);
}
pw.println("");
pw.flush();
fileIn.close();
fileOut.close();
br.readLine(); //error here
fileTransferTime = System.currentTimeMillis() - fileTransferTime;
System.out.println("File transfer time: " + fileTransferTime);
pw.close();
br.close();
s.close();
到达br.readLine()时,会引发套接字关闭异常。到目前为止我只关闭了输出流。在这种情况下,关闭输出流是否也会关闭输入流?
谢谢!
答案 0 :(得分:2)
来自java.net.Socket.getOutputStream
Closing the returned OutputStream will close the associated socket.
br
已关闭,因为它会修饰与套接字关联的输入流。奇怪但真实。可以半闭合插座。
另请注意,资源处理应按以下方式完成:
Resource resource = acquire();
try {
Decorator decorated = decorate(resource);
use(decorated);
decorated.flush();
} finally {
resource.release();
}
(可能使用Execute Around成语。)
答案 1 :(得分:0)
当您在错误之前关闭FileInputStream
两行时,是否也会关闭BufferedReader
,因为它现在没有要读取的流?我在这里猜测,不是真正的Java家伙,但它会有意义。
答案 2 :(得分:0)
据我所知,套接字应该处理其流的管理。因此,当您关闭套接字时,它会关闭底层流。
如果要关闭特定流,则应使用shutdownInput()而不是关闭输入套接字;输出也是如此。
答案 3 :(得分:0)
它应该很容易测试(解决?)它,只需将OutputStream的关闭移动到结束,在那里关闭Socket的InputStream。
或者只需查看{doc} getOutputStream()
:
关闭返回的OutputStream将关闭相关的套接字。
并关闭Socket也将关闭InputStream(close)。
关闭此套接字也将关闭套接字的InputStream和OutputStream。
答案 4 :(得分:-2)
套接字的行为高度依赖于平台,因此您永远无法确定可用的文档或方法是否可以按预期工作。
我认为关闭OutputStream
极有可能导致底层套接字被关闭。我有一个类似的问题,套接字的行为不符合预期,我之前已经问过。
This answer表示关闭套接字的输出流确实关闭了底层套接字