Должен ли я закрыть FileInputStream? - PullRequest
26 голосов
/ 23 февраля 2011

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

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

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

Ответы [ 8 ]

26 голосов
/ 23 февраля 2011

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

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

8 голосов
/ 23 февраля 2011
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();
    }
}
7 голосов
/ 23 февраля 2011

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

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

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

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

5 голосов
/ 30 мая 2016

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

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

    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 ().

5 голосов
/ 23 февраля 2011

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

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

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

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

0 голосов
/ 16 сентября 2018

Я делаю так, чтобы закрыть поток ввода файла Excel, это может помочь

abstract int workWithWorkBook(Workbook workBook);

protected int doWorkBook(Path excelFile) throws IOException {
    File f = excelFile.toFile();

    try (FileInputStream excelContent = new FileInputStream(excelFile.toFile())){
        POIFSFileSystem fileSystem = new POIFSFileSystem(excelContent);
        Workbook workBook = null;
        if (f.getName().endsWith("xls")) {
            workBook = new HSSFWorkbook(fileSystem);
        } else if (f.getName().endsWith("xlsx")) {
            workBook = new XSSFWorkbook(excelContent);
        }
        return workWithWorkBook(workBook);

    }catch (Exception e){
        e.printStackTrace();
        throw e;
    }
}

9b9ea92b-5b63-47f9-a865-fd40dd602cd5

0 голосов
/ 19 декабря 2017

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

0 голосов
/ 23 февраля 2011

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

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

...