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.
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.
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();
}
}
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
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.
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, Workbook
fermeraFileInputStream
à la fin de la méthode getWorkbook()
mais il est toujours bon de fermerWorkbook
de pouvoir être collecté.
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 ().
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.
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