在java jar文件中读取zip文件

时间:2017-08-31 17:02:42

标签: 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();

如何有效地读取zip文件,该文件位于同一个jar文件中。

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

1 个答案:

答案 0 :(得分:1)

从位于java程序的jar文件中的zip文件SampleText.zip开始,以下代码将zip文件中的文件解压缩(解压缩)到磁盘。我已经用zip文件中的2个文件对此进行了测试。我将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);
        }
    }
}