何时(多久)到 open/close input/output 流?

When (how often) to open/close input/output streams?

我正在尝试编写一个 FTP 客户端程序,并且我有输入和输出流来 在服务器和我的计算机之间传输文件

我在思考如何设计class的时候,一直犹豫着是否每次调用这个函数都要开辟一个新的InputStream,然后立即关闭(如在下面的示例中)。

或者只是在构造函数中执行此操作并在退出程序时将其关闭。有关系吗?这样做是否有意义,特别是如果用户可以选择在执行一次后立即将另一个文件上传到服务器?

public class FTPClientP extends FTP{
    private InputStream is;

    public FTPC(String serverAdd, int connection_port){
        is = null;

    }
    public int connectToServer() throws  IOException{

    }

    public boolean uploadToServer(File file) throws IOException{

        boolean uploaded = false;

        is = new FileInputStream(file);

        String fileName = myFile.getName();

        uploaded = ftp.storeFile(fileName, is);

        is.close();

        return uploaded;
    }

}

您应该 InputStreamsOutputStreams 和其他类似资源,尽快(在可能的最近范围内)打开和关闭。例如,如果我想发送一个文件,步骤是

  1. 打开 OutputStream.
  2. 发送字节。
  3. 关闭OutputStream.

如果您不关闭此类资源,您将面临内存泄漏

您可以使用 try-with 资源 这样您就不会不小心忘记关闭您的资源。您可以通过 try-with resources 使用您喜欢的任何资源,只要它实现了 AutoClosable 接口。 (InputStreamOutputStream 确实实现了 AutoClosable 接口)。

使用 try-with 资源的示例:

try (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target)){

        byte[] buf = new byte[8192];

        int i;
        while ((i = fis.read(buf)) != -1) {
            fos.write(buf, 0, i);
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }

注意InputStreamOutputStream 都在 try-with resources 语句中,在上面的示例中。