web-dev-qa-db-fra.com

Dois-je fermer FileInputStream?

Je travaille en tant que stagiaire dans Test Automation . Je travaille à la création de code Junit avec Eclipse et je l'exécute à l'aide d'Eclipse . En ce sens, je récupère les données d'une feuille Excel à l'aide de la fonction FileInputStream.

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

Est-il nécessaire de fermer la fonction Inputstream? Si tel est le cas, guide-moi avec quelques codages.

24
Olaganathan.S

Oui, vous devez close le flux d'entrée si vous souhaitez que vos ressources système soient libérées.

FileInputStream.close() est ce dont vous avez besoin.

24
asgs
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();
    }
}
8
Axel

Vous devez soit fermer (), soit mettre fin à votre programme. 

Cependant, vous pouvez rencontrer des problèmes déroutants si vous ne fermez pas le fichier en tant que

  • parfois, les tests sont exécutés individuellement ou un groupe de tests est exécuté dans le même processus. (Donc, vous pourriez avoir un test qui fonctionne dans un sens mais pas dans l'autre)
  • vous ne pouvez pas renommer ou supprimer un fichier ouvert.

Il est recommandé de toujours fermer les ressources avec lesquelles vous en avez fini. Toutefois, les tests unitaires sont des scripts qui ne doivent pas toujours suivre les meilleures pratiques.

7
Peter Lawrey

C'est toujours une bonne idée de fermer les ressources que vous utilisez, MAIS:

Si vous utilisez la ressource A dans la ressource B, il est judicieux de fermer B au lieu de A s'il dispose d'une méthode.

Dans votre cas, vous utilisez FileInputStream dans Workbook, vous feriez donc mieux de fermer Workbook et de vous appuyer sur Workbok pour le fermer FileInputStream.

Dans ce cas particulier, en fait, WorkbookfermeraFileInputStream à la fin de la méthode getWorkbook() mais il est toujours bon de fermerWorkbook de pouvoir être collecté.

5
pcjuzer

Oui! vous devez toujours libérer les ressources une fois que vous avez terminé. Java a un mécanisme puissant pour le ramassage des ordures (notez que ce n'est pas la même chose que la gestion des ressources/les fuites). Ne pas libérer les ressources peut causer des problèmes tels que: Déni de services, mauvaises performances.

Comme déjà répondu, mais un autre moyen moins efficace est essayez avec des ressources

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

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

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

Maintenant, vous n'avez pas besoin d'appeler explicitement la méthode fi.close (). 

4

Récemment, lorsque j'ai essayé de refactoriser mon code, je devais déplacer la création du classeur vers une autre méthode et FileInputStream était créé avec cette méthode. Cette méthode crée un FileInputStream et retourne un classeur. Mais FileInputStream n'est pas visible depuis la méthode principale; Alors, comment vais-je fermer mon FileInputStream à la fin de la méthode principale? La réponse est que vous n’avez pas besoin de fermer FileInputStream, mais simplement de fermer le classeur, qui ferme en interne FileInputStream. En bref, il est incorrect de dire que vous devez fermer FileInputStream quoi qu'il arrive. 

0
Tony

Je fais un tel moyen pour assurer la fermeture du flux d'entrée de fichier Excel, cela aide peut-être

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
Yu Jiaao