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.
Ja, Sie müssen den Inputstream close
verwenden, wenn Ihre Systemressourcen wieder freigegeben werden sollen.
FileInputStream.close()
ist was Sie brauchen.
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();
}
}
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
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.
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 Workbook
am Ende der getWorkbook()
-MethodeFileInputStream
geschlossen, es ist jedoch immer noch eine gute Idee, closeWorkbook
, um Müll sammeln zu können.
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.
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