关闭流

时间:2010-08-28 17:52:07

标签: java

请参阅以下代码:

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()时,会引发套接字关闭异常。到目前为止我只关闭了输出流。在这种情况下,关闭输出流是否也会关闭输入流?

谢谢!

5 个答案:

答案 0 :(得分:2)

来自java.net.Socket.getOutputStream

的API文档
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表示关闭套接字的输出流确实关闭了底层套接字