Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时(多久)打开/关闭输入/输出流?_Java_Inputstream_Outputstream - Fatal编程技术网

Java 何时(多久)打开/关闭输入/输出流?

Java 何时(多久)打开/关闭输入/输出流?,java,inputstream,outputstream,Java,Inputstream,Outputstream,我正在尝试编写一个FTP客户端程序,我有输入和输出流在服务器和我的计算机之间传输文件 当我考虑如何设计该类时,我无法决定是否在每次调用函数时打开一个新的InputStream,然后立即关闭它(如下例所示) 或者在构造函数中执行此操作,并在退出程序时关闭它。这有关系吗?这样做有意义吗,特别是当用户可以选择在完成一次后立即将另一个文件上载到服务器时 public class FTPClientP extends FTP{ private InputStream is; public

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

当我考虑如何设计该类时,我无法决定是否在每次调用函数时打开一个新的
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;
    }

}

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

  • 打开一个
    输出流
  • 发送字节
  • 关闭
    OutputStream
  • 如果不关闭这些资源,您将面临内存泄漏

    您可以使用尝试使用资源,这样您就不会意外忘记关闭资源。只要实现了
    自动关闭
    接口,您就可以使用您喜欢的任何资源try with resources。(
    InputStream
    OutputStream
    确实实现了
    AutoClosable
    接口)

    使用try with resources的示例:

    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();
        }
    

    注意:在上面的示例中,
    InputStream
    OutputStream
    都在try with resources语句中

    您应该只在必要的最短范围内定义流(或其他资源)。使用try with resources确保完成后关闭它。因此,将它定义为一个字段,而在方法调用的整个生命周期中只需要它是错误的方法。根据我所学到的:所有具有资源(流、数据库连接等)的操作都应该尽可能简短,以避免挂起处理程序(保持打开和未关闭)和内存泄漏。进入,得到你需要的,并在尽可能短的时间内离开。为多个请求方法中的每一个打开和关闭连接比在程序开始时打开连接、将连接传递给发出请求的方法并仅在程序结束时关闭连接更干净。我同意,但请注意,在某些情况下,您可能希望保持连接打开。例如,如果您知道您很快需要再次写入,并且性能是一个问题。请记住,打开和关闭是一项相当繁重的操作。@Zabuza如果您正在进行背靠背的操作,请务必将其打开。否则,最好关闭它们。