мне нужно вызывать close () для каждого нового входного потока? - PullRequest
1 голос
/ 11 марта 2019

вот код.

public static void main(String[] args) throws IOException {

    FileInputStream fis = null;

    fis = new FileInputStream(new File("D:\\za180s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za185s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za186s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za187s.ser"));
    // do something
    fis.close();

}

проблема в следующем: нужно ли мне вызывать метод fis.close () после каждого "что-то делать" или просто вызывать fis.close () один раз после всех.

игнорировать, нужно ли пытаться перехватить позицию close () в finally и код.

thx all.

Ответы [ 3 ]

7 голосов
/ 11 марта 2019

Да, вам нужно позвонить близким по каждому человеку InputStream.Проблема с вашим кодом заключается в том, что вы переопределяете переменную fis каждый раз, когда создаете новый поток.Другими словами: fis больше не указывает на старый InputStream, поэтому вызов close не приведет к закрытию предыдущего потока.

Для получения дополнительной информации, проверьте https://stackoverflow.com/a/40523/8819761

Что вы могли бытакже используйте синтаксис try-with-resources в Java 7, который автоматически закроет поток после выхода из блока try:

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something
}

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something else
}
0 голосов
/ 11 марта 2019

Вам нужно каждый раз вызывать метод close, но не волнуйтесь. Из Java SE 7 вы можете использовать try-with-resources. Согласно документу Java-Oracle,

Оператор try-with-resources является оператором try, который объявляет или больше ресурсов. Ресурс - это объект, который должен быть закрыт после программа закончена с этим. Заявление "попробуй с ресурсами" гарантирует, что каждый ресурс закрыт в конце оператора. любой объект, который реализует java.lang.AutoCloseable, который включает в себя все объекты, которые реализуют java.io.Closeable, могут использоваться в качестве ресурса.

Пожалуйста, посмотрите на пример.

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

В этом примере ресурс, объявленный в операторе try-with-resources, является BufferedReader. Оператор объявления появляется в скобках сразу после ключевого слова try. Класс BufferedReader в Java SE 7 и более поздних версиях реализует интерфейс java.lang.AutoCloseable. Поскольку экземпляр BufferedReader объявлен в операторе try-with-resource, он будет закрыт независимо от того, завершается ли оператор try нормально или внезапно (в результате метода BufferedReader.readLine, генерирующего исключение IOException).

Для получения более подробной информации, пожалуйста, ознакомьтесь с документом Oracle-Java для try-with-resources.

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

0 голосов
/ 11 марта 2019

Вы должны закрываться каждый раз, когда заканчиваете работать с InputStream.

В Java, если вы назначите

 fis = new FileInputStream(new File("D:\\za180s.ser"));

fis будет указывать на новый объект, поэтому при вызове fis.close () старые потоки не затрагиваются. И нет способа его закрыть.

...