2013-12-13 198 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