一个关于解析ZIP流文件格式的问题

allan1031 2003-08-05 04:18:47
我写了一个解析ZIP文件的CLASS,但是不知道为什么,总是只能解析出一个FILE,然后便抛出“STREAM CLOSED”异常,可是我希望能够解析出所有文件。

有人能帮我下吗

具体代码如下:

private void WorkDone() {

try{
ZipInputStream zip_In=new ZipInputStream(new FileInputStream(selfFile));
ZipEntry entry;

while((entry=zip_In.getNextEntry())!=null){

byte[] buff=new byte[4096];
BufferedInputStream bin=new BufferedInputStream(zip_In);
BufferedOutputStream bout=new BufferedOutputStream(new FileOutputStream(entry.getName()));
System.out.println("File: "+entry.getName()+" has been extracted!");
while(bin.read(buff,0,1)!=-1){
bout.write(buff,0,1);
}
bout.close();
bin.close();


zip_In.closeEntry();
}


zip_In.close();

}catch(IOException exceptionHere){
System.out.println(exceptionHere);
System.exit(0);

}

}

...全文
130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fpwang 2003-08-06
  • 打赏
  • 举报
回复
import java.io.*;
import java.util.*;
import java.util.zip.*;

public class ZipTool{
static String zipName;
private String ZIPUSER;
private String ZIPPASS;

static String TEST="asd\n asdasd\na";

static private String fileName;

static byte[] buffer=new byte[1024];
static int bytesRead;
static String entryName;
public static void main(String []args)throws IOException{
boolean HELP=false;
if(args.length==0){
help();
System.exit(0);
}
if(args.length>2 && args[0].equals("c")){
HELP=true;
zipName=args[1];

try{
ZipOutputStream zip=new ZipOutputStream(new FileOutputStream(zipName));
for(int i=2;i<args.length;i++){
fileName=args[i];

// FileInputStream file=new FileInputStream(fileName);
ZipEntry entry=new ZipEntry(fileName);
zip.putNextEntry(entry);
/*
while((bytesRead=file.read(buffer))!=-1)
zip.write(buffer,0,bytesRead);
*/
buffer=TEST.getBytes();
bytesRead=buffer.length;
zip.write(buffer,0,bytesRead);
System.out.println(entry.getName()+" added.");
// file.close();
}
zip.close();
System.out.println(zipName+" created.");
}catch(IOException ioe){ System.out.println(ioe);}
}

//解压,读压缩文件
if(args.length==3 && args[0].equals("x")){
HELP=true;
zipName=args[1];
entryName=args[2];
try{
ZipFile zip=new ZipFile(zipName);
ZipEntry entry=zip.getEntry(entryName);
if(entry!=null){
InputStream entryStream=zip.getInputStream(entry);
FileOutputStream file=new FileOutputStream("asd/"+entry.getName());
while((bytesRead=entryStream.read(buffer))!=-1)
//System.out.println(new String(buffer)+" "+bytesRead);
file.write(buffer,0,bytesRead);
System.out.println(entry.getName()+" extracted.");
file.close();
entryStream.close();
}else System.out.println(entryName+" not found.");
zip.close();
}catch(IOException ioe){
System.out.println(ioe);
}
}

if(args.length==2 && args[0].equals("l")){
HELP=true;
try{
ZipFile zip=new ZipFile(args[1]);

for(Enumeration list=zip.entries();list.hasMoreElements();){
ZipEntry entry=(ZipEntry)list.nextElement();
System.out.println(entry.getName());
}
zip.close();
}catch(IOException ioe){
System.out.println(ioe);
}
}

if(!HELP) help();
}

private static void help(){
System.out.println("Usage:ZipTool<command><zip_file>[<file>...]");
}
}
seven1996 2003-08-06
  • 打赏
  • 举报
回复
楼主,你的代码中while语句中似乎有句不需要,如下:
while((entry=zip_In.getNextEntry())!=null){

byte[] buff=new byte[4096];
BufferedInputStream bin=new BufferedInputStream(zip_In);
BufferedOutputStream bout=new BufferedOutputStream(new FileOutputStream(entry.getName()));
System.out.println("File: "+entry.getName()+" has been extracted!");
while(bin.read(buff,0,1)!=-1){
bout.write(buff,0,1);
}
bout.close();
bin.close();


zip_In.closeEntry();\\为何要closeEntry????
}

删掉它试试
ChDw 2003-08-06
  • 打赏
  • 举报
回复
你不应该调用bin.close();
如果你需要使用BufferedInputStream
那么应该是包装在ZipInputStream 里面
ZipInputStream zip_In=new ZipInputStream(new BufferedInputStream(new FileInputStream(selfFile)));

下面就不要使用BufferedInputStream 了,并且绝对不能调用in.close()
allan1031 2003-08-06
  • 打赏
  • 举报
回复
哪位大人可以给我一个答复呢

分不够的话我可以再加的说~~~
本研究提供了一套完整的Python实现方案,用于通过图神经网络(GNN)技术预测分子的能量属性。该资源包包含了可直接运行的源代码以及经过处理的标准化数据集,旨在为计算化学与材料科学领域的相关研究提供一套即用型工具。 方案的核心是构建一个基于图结构的分子表示模型。在该模型中,分子被抽象为图数据,其中原子作为节点,化学键作为边。节点与边均被赋予初始的特征向量,这些特征编码了原子类型、键级等关键化学信息。所实现的图神经网络架构通过多轮消息传递机制,能够有效地聚合分子内部的局部化学环境信息,从而学习到分子的全局表示。最终,一个全连接层将该图级表示映射为单一的标量输出,即预测的分子能量。 本资源包中的数据集包含了大量已知分子的结构信息及其对应的能量值,已预先划分为训练集、验证集与测试集,便于进行模型训练与性能评估。代码结构清晰,注释完整,涵盖了从数据加载、图结构构建、模型定义、训练循环到结果可视化的全程。使用者可通过修改配置文件轻松调整模型超参数,或替换自有数据集进行迁移学习。 资源来源于网络分享,仅用于学习交使用,请勿用于商业,如有侵权请联系我删除!
内容概要:本文通过MATLAB实现了一种基于RSSI(接收信号强度指示)的无线传感器网络节点定位算法。文章首先设定仿真环境,包括多个已知坐标的锚节点和一个待定位的未知节点,利用RSSI与距离之间的传播模型将测得的信号强度转换为距离估计,并引入高斯噪声模拟实际测量误差。随后采用多边定位法(最小二乘法)构建线性方程组,求解未知节点的坐标估计值,并计算其与真实位置之间的定位误差。最后通过图形化方式展示锚节点、真实节点、估计节点及其连接关系,并输出关键数据结果。; 适合人群:具备一定MATLAB编程基础和无线通信基础知识的高校学生、科研人员或从事物联网、传感器网络相关工作的技术人员;适合对定位算法原理与仿真实现感兴趣的学习者。; 使用场景及目标:①用于教学演示或科研验证RSSI定位的基本原理;②帮助理解从信号强度到距离估算再到坐标求解的完整程;③为后续改进算法(如引入滤波、加权最小二乘等)提供基础框架; 阅读建议:此资源以MATLAB代码为核心,建议读者逐段运行代码,结合注释理解每一步的数学原理与物理意义,重点关注RSSI转距离模型、最小二乘法的应用以及误差来源分析,可通过调整参数(如噪声水平、路径损耗指数)观察对定位精度的影响,加深理解。

62,628

社区成员

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

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