如何将一个zip文件加载成为FileInputStream对象?

beyondii 2003-10-30 05:45:56
如题.谢谢.
...全文
557 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2003-10-31
  • 打赏
  • 举报
回复
sorry, opened too many windows, didn't see outer2000(天外流星)'s reply, ignore my reply
saucer 2003-10-31
  • 打赏
  • 举报
回复
I guess you mean InputStream, see the example at

Reading ZIP Files
http://javaboutique.internet.com/resources/books/JavaNut/javanut2_6.html

Unzipping Files with java.util.zip.ZipFile
http://gethelp.devx.com/techtips/java_pro/10MinuteSolutions/10min0300.asp

basially, you do

InputStream st = zipFile.getInputStream(zipFile.getEntry(entryName));

for example, from the first link:

import java.io.*;
import java.util.zip.*;

String filename; // File to read; initialized elsewhere
String entryname; // Entry to read from the ZIP file; initialized elsewhere
ZipFile zipfile = new ZipFile(filename); // Open the ZIP file
ZipEntry entry = zipfile.getEntry(entryname); // Get one entry
InputStream in = zipfile.getInputStream(entry); // A stream to read the entry
BufferedInputStream bis = new BufferedInputStream(in); // Improves efficiency
outer2000 2003-10-31
  • 打赏
  • 举报
回复
其实这些东西都是从GOOGLE搜索到的;
不会的东西,自己都想办法解决,真的很好的饿;
outer2000 2003-10-31
  • 打赏
  • 举报
回复
重要的是,要注意ZipInputStream类是连续地读取ZIP文件的。 不过,类ZipFile使用内部随机存取文件读取ZIP文件的内容,所 以不必连续地读取ZIP文件的条目。



--------------------------------------------------------------------------------
注意: ZIPInputStream和ZipFile间的另 一个基本区别是在高速缓存方面。在结合使用ZipInputStream和 FileInputStream读取文件时,Zip条目没有进行高速缓存。不 过,如果文件是用ZipFile(fileName)打开的,然后在内部进行 高速缓存,那么,在ZipFile(fileName)被再次调用时,该文件 仅仅被打开一次。高速缓存值应用在第二次打开时。如果使用的是 UNIX,则 值得注意的是,使用ZipFile打开的全部ZIP文件都是内存映射 的,因此ZipFile的性能优越于ZipInputStream。 不过,如果相同ZIP文件的内容在程序执行期间要经常地进行更改和重新加 载,那么使用ZipInputStream效果更好。
--------------------------------------------------------------------------------


下面是 ZIP 文件使用ZipFile类进行解压的方式:

创建ZipFile对象,方式是将待读取的ZIP文件指定为字符 串文件名或 File 对象。

ZipFile zipfile = new ZipFile("figs.zip");
使用条目方法,返回Enumeration对象,以循环通过文件全 部的ZipEntry对象:
while(e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
// read contents and save them
}

通过将 ZipEntry传递到getInputStream的 方式,读取 ZIP 文件内部具体的ZipEntry,它将返回可以读取 条目内容的InputStream对象:
is = new
BufferedInputStream(zipfile.getInputStream(entry));




检索条目的文件名并创建输出流,以便保存:
byte data[] = new byte[BUFFER];
FileOutputStream fos = new
FileOutputStream(entry.getName());
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}

最后关闭所有输入与输出流∶
dest.flush();
dest.close();
is.close();

完整的源程序如代码样本2所示。为测试该类,请再次进行编译和运行,方式 是传递 ZIP 格式参数的文件。

prompt> java UnZip2 somefile.zip

代码样本2: UnZip2.java

import java.io.*;
import java.util.*;
import java.util.zip.*;

public class UnZip2 {
static final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedOutputStream dest = null;
BufferedInputStream is = null;
ZipEntry entry;
ZipFile zipfile = new ZipFile(argv[0]);
Enumeration e = zipfile.entries();
while(e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
System.out.println("Extracting: " +entry);
is = new BufferedInputStream
(zipfile.getInputStream(entry));
int count;
byte data[] = new byte[BUFFER];
FileOutputStream fos = new
FileOutputStream(entry.getName());
dest = new
BufferedOutputStream(fos, BUFFER);
while ((count = is.read(data, 0, BUFFER))
!= -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

压缩和归档 ZIP 文件中的数据
ZipOutputStream可用于将数据压缩到ZIP文件。 ZipOutputStream以ZIP格式将数据写入输出流。创建ZIP文件的步 骤很多。

第一步是创建ZipOutputStream对象,将向它传递希望写入 文件的输出流。创建名为“myfigs.zip”的ZIP文件的方式是:
FileOutputStream dest = new
FileOutputStream("myfigs.zip");
ZipOutputStream out = new
ZipOutputStream(new BufferedOutputStream(dest));

一旦创建了目标压缩输出流,下一步就是打开源数据文件。本例中的源数 据文件在当前目录中。列表命令用来获取当前目录文件的列表:
File f = new File(".");
String files[] = f.list();
for (int i=0; i<files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new FileInputStream(files[i]);
// create zip entry
// add entries to ZIP file
}



--------------------------------------------------------------------------------
注意: 本代码样本能够压缩当前目录中的所有文件。它不处理子目 录。作为训练,您可以修改代码样本 3,以处理子目录。


--------------------------------------------------------------------------------



为被读取的每个文件创建压缩条目: ZipEntry entry = new ZipEntry(files[i]))
在向ZIP输出流写入数据之前,您必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象∶ out.putNextEntry(entry);
向ZIP 文件写入数据∶
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}

最后,结束输入与输出流∶
origin.close();
out.close();

完整的源程序如代码样本 3 所示。

代码样本3: Zip.java

import java.io.*;
import java.util.zip.*;

public class Zip {
static final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new
FileOutputStream("c:\\zip\\myfigs.zip");
ZipOutputStream out = new ZipOutputStream(new
BufferedOutputStream(dest));
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = new byte[BUFFER];
// get a list of files from current directory
File f = new File(".");
String files[] = f.list();

for (int i=0; i<files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new
FileInputStream(files[i]);
origin = new
BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i]);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0,
BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}



--------------------------------------------------------------------------------
注意:条目可以添加到压缩(DEFLATED)或未压缩(STORED)表格中的 ZIP 文件里。setMethod可用于设置存储的方法。例如,将方法设 置为 DEFLATED (压缩),请使用: out.setMethod(ZipOutputStream.DEFLATED);将它设置为 STORED (非压缩),请使用:out.setMethod ( ZipOutputStream.STORED)。


outer2000 2003-10-31
  • 打赏
  • 举报
回复
技术文章
使用Java API压缩和 解压缩数据
从ZIP文件解压并抽取数据
java.util.zip包提供了数据压缩和解压缩的类。解压ZIP文件 实质是从输入流中读出数据。java.util.zip包提供了读取ZIP文件 的ZipInputStream类。可以像任何其他输入流那样创建 ZipInputStream。例如,下列代码可用于创建输入流,以从ZIP文 件格式中读出数据:

FileInputStream fis = new FileInputStream("figs.zip");
ZipInputStream zin = new
ZipInputStream(new BufferedInputStream(fis));

一旦打开ZIP输入流,就可以使用getNextEntry方法读取zip条 目,该方法返回ZipEntry对象。如果到达文件末尾, getNextEntry就会返回零值:

ZipEntry entry;
while((entry = zin.getNextEntry()) != null) {
// extract data
// open output streams
}

现在创建解压缩输出流,如下:

int BUFFER = 2048;
FileOutputStream fos = new
FileOutputStream(entry.getName());
BufferedOutputStream dest = new
BufferedOutputStream(fos, BUFFER);



--------------------------------------------------------------------------------
注意: 在此节代码中,我们用BufferedOutputStream代 替了ZIPOutputStream。 ZIPOutputStream和 GZIPOutputStream使用大小为 512 的内部缓冲。 BufferedOutputStream的使用仅在缓冲的大小远远超过 512 时 (本例的设置为 2048)要予以调整。不过,在ZIPOutputStream 的情况下,当GZIPOutputStream不许设置缓冲区大小时,可以将 内部缓冲区大小指定为设计参数。
--------------------------------------------------------------------------------


在本节代码中,文件输出流是使用条目的名称创建的,该名称可以使用 entry.getName方法进行检索。然后,源压缩数据会读写到解压 流:

while ((count = zin.read(data, 0, BUFFER)) != -1) {
//System.out.write(x);
dest.write(data, 0, count);
}

最后,结束输入与输出流∶

dest.flush();
dest.close();
zin.close();

代码样本 1 中的源程序介绍了如何从 ZIP 文件中解压和提取文件。要测试 此样本,可对类进行编译,并通过传递 ZIP 格式的已压缩文件来进行运行:

prompt> java UnZip somefile.zip

注意,somefile.zip可以是任何ZIP兼容工具,如WinZip,创 建的ZIP文件。

代码样本 1: UnZip.java

import java.io.*;
import java.util.zip.*;

public class UnZip {
final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedOutputStream dest = null;
FileInputStream fis = new
FileInputStream(argv[0]);
ZipInputStream zis = new
ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
FileOutputStream fos = new
FileOutputStream(entry.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(Exception e) {
e.printStackTrace();
}
}
}

beyondii 2003-10-31
  • 打赏
  • 举报
回复
没有人研究过?
beyondii 2003-10-30
  • 打赏
  • 举报
回复
我的意思是说将压缩文件中的一个文件读取出来作为一个FileInputStream
sha256cn 2003-10-30
  • 打赏
  • 举报
回复
直接加载不就得了,FileInputStream fis=new FileInputStream("c:/zip.zip");

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧