2011-02-23 5 views
20

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

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

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

ответ

22

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

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

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

Просто небольшой комментарий - вам также нужно обернуть оператор 'close()' с помощью try/catch, поскольку 'close()' объявляет о необходимости сбросить исключение IOException. Фактически, вы не можете так долго использовать. У вас может быть только try/finally с исключениями времени выполнения. Но с проверенными исключениями, такими как IOException и подклассы, вы должны иметь try/catch или try/catch/finally ... он не будет компилироваться с помощью try/finally. –

+2

Зависит от того, объявлено ли IOException для метода. Если вы поймаете это, вы должны знать, что с ним делать. Важная часть заключается в том, чтобы закрыть() в блоке finally. Фактически автоматическая обработка этого является одной из особенностей, которые я действительно ожидаю увидеть на Java 7. – Axel

6

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

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

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

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

-1

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

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

+2

Это действительно ужасный подход слепо следовать установленным правилам без критики и понимания части * почему? *. * Плохие вещи будут происходить * - oh common ?! Программирование не является магией вуду, не говоря уже о последствиях (** файл не может быть перемещен, в общем случае могут возникнуть утечки памяти, возможно, будет опущен пул файлов os) (https://stackoverflow.com/questions/ 1661322/too-many-open-file-handle) **) из не правильно освобожденных ресурсов ваш ответ бесполезен и, кроме того, вреден. ** Downvoted. ** –

+1

Oooo, я использую форму речи, и вы идете «ZOMG, он верит в вуду» (в отличие от «hhhh, он не говорил это и не выбирал какой-то народный язык». несколько других ответов, которые не говорят о последствиях, и если вы не отправитесь отрицать их, вы просто поднимаетесь на кучу ящиков с мылом на предвзятой высокой лошади. Почему я не говорю о проблемах (и почему большинство люди в этой теме не были)? Потому что им легко найти подходящую литературу, доступную всем, кто занимается исследованиями. Ваш выбор, если вы обнаружите, что это неуместно. –

5

Это всегда хорошая идея, чтобы закрыть ресурсы, которые вы используете, НО:

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

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

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

3

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

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

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() метод.

0

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

Смежные вопросы