Когда (как часто) открывать / закрывать потоки ввода / вывода? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь написать клиентскую программу 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;
    }

}

1 Ответ

0 голосов
/ 02 февраля 2019

Вы должны открыть и закрыть InputStreams, OutputStreams и другие подобные ресурсы, как можно скорее (в ближайшей возможной области видимости).Например, если я хочу отправить файл, необходимо выполнить следующие шаги:

  1. Открыть OutputStream.
  2. Отправить байты.
  3. Закрыть OutputStream.

Если вы не закроете такие ресурсы, вы столкнетесь с утечкой памяти .

Вы можете использовать ресурсы для попытки , чтобы вы моглине забудем случайно закрыть свой ресурс.Вы можете использовать любой понравившийся вам ресурс с try-with resources , если он реализует интерфейс AutoClosable.(InputStream и OutputStream действительно реализуют интерфейс 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();
    }

Примечание : обаInputStream И OutputStream находятся в инструкции try-with resources, в приведенном выше примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...