我有一個JavaFX應用程序,它顯示來自VBox中某個文件夾的所有圖像。垂直框中,建這樣的:在JavaFX中安全關閉/刪除ImageView的文件
try (DirectoryStream<Path> stream = Files.newDirectoryStream(imagePath)) {
for (Path file : stream) {
String fileNameLc = file.toString().toLowerCase();
if (fileNameLc.matches(".*\\.(jpg|png)")) {
ImageView graph = new ImageView(new Image(Files.newInputStream(file)));
graph.setPreserveRatio(true);
imageVBox.getChildren().add(graph);
}
}
} catch (IOException ex) {
//
}
還有一個按鈕來刪除其顯示在VBox中的文件夾中的所有圖像(和所有其他文件)。這是按鈕操作的代碼:
imageVBox.getChildren().clear();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(imagePath)) {
for (Path file : stream) {
Files.delete(file);
System.out.println("Removing: " + file);
}
} catch (IOException ex) {
//
}
顯示圖像正常,但刪除它們不起作用。在標準輸出我看到
Removing: /foo/img1.jpg
Removing: /foo/img2.jpg
...
沒有異常拋出,但圖像文件仍然存在,如果檢查該文件夾的內容。文件夾中不是圖像的所有文件(並且不顯示在VBox中)都會成功刪除,但VBox中顯示的圖像不會。
我認爲原因是,經過
imageVBox.getChildren().clear();
後臺線程開始刪除圖像和.clear()方法立即返回。這樣,在關閉圖像資源之前執行刪除文件的代碼塊。
什麼是最好的方式來關閉圖像?爲什麼Files.delete()方法沒有拋出異常?
我不能重現。我沒有真正購買你的解釋:沒有創建後臺線程來從'VBox'中刪除'ImageView',並且一旦讀取圖像數據就應該釋放文件句柄。你可以創建一個[MCVE](http://stackoverflow.com/help/mcve)嗎? – 2014-10-12 19:43:01
圖像中顯示的文件是唯一沒有刪除的文件,那是什麼讓我認爲圖像瀏覽不會釋放圖像資源。我會在本週的某個時候寫一個MVCE。我還注意到,這個問題只發生在Windows 7上,而不是在win8或Linux上(全部使用Oracle Java SE 8)。 – 2014-10-13 20:05:08
好的,我在Mac上,所以也許這就是爲什麼我不能重現它。有趣。 – 2014-10-13 20:26:41