我有一个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”);我找到了几个论坛,他们提到分裂会导致大量内存的消耗。
答案 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);
}
}
}