2017-08-31 71 views
0

我有一个Java应用程序。此应用程序的可执行jar还包含一些zip和文本文件,它们在应用程序启动时读取。我可以很容易地处理阅读文本文件使用在java jar文件中读取zip文件

getResourceAsStream 

,但问题是阅读zip文件。

我试着用下面的代码,但是这只是增加了4次内存使用量。

 // location of the file 
     InputStream is = ChemicalSynonyms.class.getClassLoader().getResourceAsStream(strFileName); 
     ZipInputStream zis = new ZipInputStream(is); 
     ZipEntry ze = zis.getNextEntry(); 
     Scanner sc = new Scanner(zis); 
     String[] wordsArray; 

     while (sc.hasNextLine()) 
     { 
      // split on tab and use only the first column 
      wordsArray = sc.nextLine().toLowerCase().split("\t"); 
      termSet.add(wordsArray[0]); 
     } 

     sc.close(); 
     zis.close(); 
     is.close(); 

如何有效地读取压缩文件,该压缩文件在同一个jar文件中。

****编辑**** 看来问题在于sc.nextLine()。toLowerCase()。split(“\ t”);我发现了几个论坛,他们提到分裂会导致消耗大量内存。

+0

您正在处理的zip文件有多大?这个过程将膨胀,并将所有“单词”放入内存中的数组中。如果你正在处理大量的数据,我不确定是否存在咀嚼记忆的问题。 – slambeth

+0

压缩文件相对较小。总共31MB(压缩后) – user1631306

+0

我怀疑我没有使用正确的方法读取使用扫描仪的zip文件。有没有更好的方法? – user1631306

回答

1

从位于java程序jar文件中的zip文件SampleText.zip开始,以下代码将zip文件中的文件解压缩(解压缩)到磁盘。我已经用zip文件中的两个文件测试过了。我把压缩文件放在package文件的jar文件中。

package readzipfilefromjar; 

import java.lang.Class; 
import java.net.URL; 
import java.io.InputStream; 
import java.util.zip.ZipInputStream; 
import java.util.zip.ZipEntry; 
import java.io.IOException; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 

/** 
* @author Charles 
* 
* unzips zip file contained in jar 
*/ 
public class ReadZipFileFromJar { 

    public static void main(String[] args) { 
     (new UnZip()).unzip("SampleText.zip"); 
    }  
} 

class UnZip { 

    void unzip(String zipFileNameStr) { 

     final int BUFFER = 2048; 
     Class myClass = this.getClass(); 
     InputStream inStream = myClass.getResourceAsStream(zipFileNameStr);  
     ZipInputStream zis = new ZipInputStream(inStream); 
     ZipEntry ze; 
     try { 
      BufferedOutputStream dest; 
      while((ze = zis.getNextEntry()) != null) { 
       System.out.println("Extracting: " + ze); 
       int count; 
       byte data[] = new byte [BUFFER]; 
       // write the current file to the disk 
       FileOutputStream fos = new FileOutputStream(ze.getName()); 
       dest = new BufferedOutputStream(fos, BUFFER); 
       while ((count = zis.read(data, 0, BUFFER)) != -1) { 
        dest.write(data, 0, count); 
       } 
       dest.flush(); 
       dest.close(); 
      } 
      zis.close(); 
     } 
     catch (IOException e) { 
      System.out.println("IOException: " + e); 
     } 
    } 
} 
+0

当我测试了这个,我把压缩文件放在package文件夹的jar文件中。 – Charles

+0

我会接受你的回答。但是我发现了我的问题的原因。 Apprantely,Java的“分裂”功能导致一些内存泄漏时,其被称为万次。 – user1631306