2013-12-13 216 views
1

我想壓縮文件內使用java FileSystem目錄。當只有很少的文件時工作正常,但當超過100個文件時失敗。在ZIP中的多個文件zip錯誤ZIP文件系統

這是我在程序中使用的代碼:

Map<String, String> env = new HashMap<>(); 
env.put("create", "true"); 
URI uri = URI.create("jar:file://10.0.8.31/Shared/testFile.zip"); 
long bytesRead = 0; 
File dir = new File("D:\\Shared\\DPXSequence"); 

try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) { 
    for (File sourceF : dir.listFiles()) { 
     Path externalFile = Paths.get(sourceF.getAbsolutePath()); 
     Path pathInZipfile = zipfs.getPath("/" + sourceF.getName()); 

     // copy a file into the zip file 
     Files.copy(externalFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING); 
    } 
} 
catch(Exception e) { 
    System.out.println("Error : "+e.toString()); 
} 

這是我收到的錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 

我哪裏做錯了嗎? 我認爲Files.copy()執行完成之前,它實際上壓縮並複製到目標文件夾。這是造成這個問題嗎?

+1

也許這個[回覆](http://stackoverflow.com/a/23861949/2287893)by @ diego-giagio回答有助於克服OOM。 – MZerau

回答

1

您嘗試複製的文件大或者因爲某種原因System.gc()未被激活並清除所使用的內存。

因此,檢查以下內容:

輸入[的System.gc();]所述files.copy後的方法

OR

運行分配給它更多的內存java程序:

java -Xmx1024M -Xms1024M -jar jarName.jar(如果它是jar) Xmx是要分配的最大金額(以M爲單位),並且Xms是初始金額。你可以用任何你想要的東西代替1024,而不會超過你計算機上的RAM。

+0

每個文件大小約爲8MB。還有將近5000個文件需要壓縮。 'System.gc();'沒有運氣。我不能分配更多的內存給Java,它在我的環境中受到限制。 –

+0

你幾乎可以像閱讀文件一樣去做。使用一個「緩衝區」並一次複製一些。我很抱歉,但我不知道如何使用上面的代碼來實現這個.. System.gc()應該工作..哦。 – user2494817