2013-03-25 67 views
2

我正在研究一個程序文件系統的概念。我正在用Java編寫(使用JDK 7 u17)。爲什麼我的測試文件系統只能在內存中工作?

要開始,我建立了一些教程,展示瞭如何使用FileSystemProvider類創建基於zip的文件系統。

當我執行代碼時,我將它做了類似的任務,即從我的桌面複製文本文件並將其放入zip文件中。問題是,一旦它複製文件,它不會將它寫入壓縮文件,它似乎將文件保留在內存中,當程序終止時它會被銷燬。

問題是我不明白爲什麼,據我可以告訴一切看起來是爲了,但事情顯然不是!

哦,是的,同樣的事情也適用於目錄。如果我告訴文件系統創建一個新的目錄,它只是在內存中創建它,並且zip文件中沒有任何內容。

無論如何,這裏是我的工作代碼;

import java.io.IOException; 
import java.net.URI; 
import java.nio.file.FileSystem; 
import java.nio.file.FileSystems; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.HashMap; 
import java.util.Map; 

public class Start { 

    public static void main(String[] args) { 

     Map <String, String> env = new HashMap<>(); 
     env.put("create", "true"); 
     env.put("encoding", "UTF-8"); 

     FileSystem fs = null; 

     try { 
      fs = FileSystems.newFileSystem(URI.create("jar:file:/Users/Ian/Desktop/test.zip"), env); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Path externalTxtFile = Paths.get("/Users/Ian/Desktop/example.txt"); 
     Path pathInZipFile = fs.getPath("/example.txt"); 

     try { 
      Files.createDirectory(fs.getPath("/SomeDirectory")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if (Files.exists(fs.getPath("/SomeDirectory"))) { 
      System.out.println("Yes the directory exists in memory."); 
     } else { 
      System.out.println("What directory?"); 
     }  

     // Why is the file only being copied into memory and not written out the jar/zip archive? 
     try { 
      Files.copy(externalTxtFile, pathInZipFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // The file clearly exists just before the program ends, what is going on? 
     if (Files.exists(fs.getPath("/example.txt"))) { 
      System.out.println("Yes the file has been copied into memory."); 
     } else { 
      System.out.println("What file?"); 
     } 

    } 

} 
+5

你有沒有打過電話'fs.close( )'在退出之前? – TAS 2013-03-25 07:50:45

+0

@TAS ...哇,我覺得愚蠢,我所遵循的例子顯然是不完整的。關閉文件系統解決了我的問題。謝謝! – ianc1215 2013-03-25 07:53:59

回答

0

我只是想添加一些東西。 也許你找到的例子是不完整的(我不能檢查,因爲你沒有引用它),但在所有的例子中,我發現FileSystem實例已關閉。

文件系統抽象類實現了可關閉的,所以close()方法被調用(自動)留在下面的代碼的嘗試:

try (final FileSystem fs = FileSystems.newFileSystem(theUri, env)) { 
    /* ... do everything you want here ; do not need to call fs.close() ... */ 
} 

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

相關問題