webentwicklung-frage-antwort-db.com.de

Muss ich FileInputStream schließen?

Ich arbeite als Trainee in Test Automation ..__ Ich arbeite mit der Erstellung von Junit-Code mit Eclipse und laufe mit Eclipse . Dabei rufe ich die Daten mit der FileInputStream-Funktion aus der Excel-Tabelle ab.

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

Muss die Inputstream-Funktion geschlossen werden? Wenn ja, bitte führe mich mit einigen Codierungen.

24
Olaganathan.S

Ja, Sie müssen den Inputstream close verwenden, wenn Ihre Systemressourcen wieder freigegeben werden sollen.

FileInputStream.close() ist was Sie brauchen.

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

Sie müssen entweder schließen () oder Ihr Programm beenden. 

Sie können jedoch auf verwirrende Probleme stoßen, wenn Sie die Datei nicht als schließen

  • manchmal werden Tests einzeln oder eine Gruppe von Tests im selben Prozess ausgeführt. (Du könntest also einen Test haben, der auf eine Weise funktioniert, aber nicht auf die andere.)
  • sie können eine geöffnete Datei nicht umbenennen oder löschen.

Es ist empfehlenswert, Ihre Ressourcen immer zu schließen, damit Sie damit fertig sind. Ich sehe Komponententests jedoch als Skripts, die nicht immer den Best Practices entsprechen müssen.

7
Peter Lawrey

Es ist immer eine gute Idee, die von Ihnen verwendeten Ressourcen zu schließen, , ABER:

Wenn Sie die Ressource A in der Ressource B verwenden, ist es sinnvoll, B anstelle von A zu schließen, wenn dafür eine Methode vorhanden ist.

In Ihrem Fall verwenden Sie FileInputStream in Workbook. Sie sollten also Workbook schließen und sich auf Workbok verlassen, damit FileInputStream geschlossen wird.

In diesem speziellen Fall wird Workbookam Ende der getWorkbook()-MethodeFileInputStream geschlossen, es ist jedoch immer noch eine gute Idee, closeWorkbook, um Müll sammeln zu können.

5
pcjuzer

Ja! Sie sollten die Ressourcen immer erst dann freigeben, wenn Sie mit ihnen fertig sind. Java verfügt über einen leistungsstarken Mechanismus für die Garbage Collection (beachten Sie, dass es im Vergleich zu Ressourcenverwaltung/Lecks anders ist.) .__ Ein Garbage-Collector kann also nicht feststellen, ob Sie die Ressource in der Zukunft benötigen oder nicht? Wenn Ressourcen nicht freigegeben werden, kann dies zu Problemen wie Ablehnung von Diensten und schlechter Leistung führen.

Wie schon beantwortet, aber eine andere Anstrengung ist weniger möglich versuche es mit Ressourcen

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

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

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

Jetzt müssen Sie die fi.close () -Methode nicht explizit aufrufen. 

Als ich vor kurzem versuchte, meinen Code umzugestalten, musste ich die Arbeitsmappenerstellung auf eine andere Methode verschieben und der FileInputStream wird in dieser Methode erstellt. Diese Methode erstellt einen FileInputStream und gibt eine Arbeitsmappe zurück. FileInputStream ist jedoch von der Hauptmethode nicht sichtbar. Wie schließe ich meinen FileInputStream am Ende der Hauptmethode? Die Antwort ist, Sie müssen FileInputStream nicht schließen, stattdessen schließen Sie einfach die Arbeitsmappe, wodurch FileInputStream intern geschlossen wird. Kurz gesagt, es ist falsch zu sagen, dass Sie FileInputStream auf jeden Fall schließen müssen. 

0
Tony

Ich versuche so, den Eingabedatenstrom der Excel-Datei zu schließen, was vielleicht hilft

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