Подтвердить что ты не робот

Мне нужно закрыть FileInputStream?

Я работаю стажером в Test Automation. Я работаю над созданием кода Junit с Eclipse и запускаю с помощью Eclipse. В этом я возвращаю данные из листа excel, используя функцию FileInputStream.

FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);

Необходимо ли закрыть функцию Inputstream? Если это так, пожалуйста, помогите мне с некоторыми кодировками.

4b9b3361

Ответ 1

Да, вам нужно close входной поток, если вы хотите, чтобы ваши системные ресурсы были отпущены.

FileInputStream.close() - это то, что вам нужно.

Ответ 2

FileInputStream fi=null;
try {
    fi=new FileInputStream("c:\\search.xls");
    Workbook w=Workbook.getWorkbook(fi);
    Sheet s=w.getSheet(0);
} finally {
    if (fi!=null) {
        fi.close();
    }
}

Ответ 3

Вам либо нужно закрыть(), либо завершить свою программу.

Однако вы можете столкнуться с запутанными проблемами, если вы не закрываете файл как

  • Иногда тестирование выполняется отдельно или группа тестов выполняется в одном и том же процессе. (Таким образом, у вас может быть тест, который работает один, но не другой).
  • вы не можете переименовать или удалить открытый файл.

Лучше всего всегда закрывать свои ресурсы, которые вы закончили с ними, однако я вижу модульные тесты как скрипты, которые не всегда должны следовать лучшей практике.

Ответ 4

Всегда полезно закрыть ресурсы, которые вы используете, НО:

Если вы используете ресурс A в ресурсе B, разумно закрыть B вместо A, если он имеет для этого метод.

В вашем случае вы используете FileInputStream в Workbook, поэтому вам лучше закрыть Workbook и положиться на Workbok, чтобы он закрыл FileInputStream.

В этом конкретном случае на самом деле Workbook закрывается FileInputStream в конце метода getWorkbook(), но он все еще остается хорошая идея close Workbook, чтобы иметь возможность собирать мусор.

Ответ 5

Да! вы должны всегда выпускать ресурсы один раз после того, как вы закончите с ними. Java имеет мощный механизм для Garbage Collection (обратите внимание, что это отличается от управления ресурсами/утечек). Итак, сборщик мусора не может определить, что, если вам нужен ресурс в будущем или нет? Невозможность выпуска ресурсов может вызвать такие проблемы, как отказ в обслуживании, низкая производительность.

Как уже было сказано, но еще одна попытка меньше попробовать с ресурсами

    try (FileInputStream fi = new FileInputStream("c:\\search.xls")) {

         //do something with fi.
         //fi.getChannel() ;

    } catch(IOException e) {
        // exception handling.
    } finally {
    // some statements for finally.
   }

Теперь вам не нужно явно вызывать метод fi.close().

Ответ 6

Недавно, когда я попытался реорганизовать свой код, мне пришлось переместить создание книги в другой метод, и FileInputStream создается в этом методе. Этот метод создает FileInputStream и возвращает рабочую книгу. Но FileInputStream не отображается из основного метода; так как я могу закрыть свой FileInputStream в конце основного метода? Ответ заключается в том, что вам не нужно закрывать FileInputStream, вместо этого вы просто закрываете книгу, которая внутренне закрывает FileInputStream. Короче говоря, неверно говорить, что вы должны закрыть FileInputStream независимо от того, что.

Ответ 7

Basic CompSci 101 сообщит нам, чтобы мы закрывали ресурсы, которые мы открываем, на Java или на любом языке. Так что да, вам нужно закрыть их. Bad juju обязательно произойдет, когда вы этого не сделаете.

Кроме того, вы должны изучить (и иметь склонность) использовать Javadocs. Посмотрите на Javadoc для FileInputStream и Closeable. Ответы есть.