ZipInputStream怎么解压出文件啊?

cllxyuer 2003-12-01 03:57:44
用ZipInputStream打开ZIP文件时没有出错。
用getNextEntry()得到实例后,只能取出实例的名字,其它的都取不到:
System.out.println(zipentry.getName());
System.out.println(zipentry.isDirectory());
System.out.println(zipentry.STORED);
System.out.println(zipentry.getSize());
System.out.println(zipentry.getCompressedSize());
System.out.println(zipentry.getCrc());

还有,在我使用getNextEntry()之前,zipinputstream.read(b[]);读出来的是空的。getNextEntry()之后,可以读出一些出来,但好像内容不对

我现在真的晕了,不知道该怎样搞了...


注:我刚学Java不久,一些还不太懂。
...全文
508 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cllxyuer 2003-12-02
  • 打赏
  • 举报
回复
up
cllxyuer 2003-12-01
  • 打赏
  • 举报
回复
我是用zipinputstream.read(b)出来的,可以read出2K多的字节(b我定议为byte b=new byte[10240]大)。

不过,我发现用我在一个论坛上找到的一个叫linzip的东东可以解出里里面东东出来。大小我猜可能正常。

我用文本的方式查看那个文件,应该是一个序列化的对象。而那个对象应该就是我上面弄出来贴出来的对象。但我的代码一readObject就出错了。说是流头无效。

cql0007 2003-12-01
  • 打赏
  • 举报
回复
一个对象要写入文件,一定要实现对象序列化的.
如果他原来是以他定义的对象写入文件的,那是一定要以他定义的那种对象读出来的吧.
还有,你用"zipinputstream可以读出里面的zipentry名称,也能读些数据如下"
你的读数据的方式是怎么读的?用什么方法?
cllxyuer 2003-12-01
  • 打赏
  • 举报
回复
那么,在解压出来的那个对象的数据中。
O0000OOO00I
O0O00OOO00I
OO000O0O00I
OO000OOO00I
OO0OOO0O00I
OOO00OOO00[
O000O00O00t [F[
....

行首的那些
O0000OOO00
O0O00OOO00
OO000O0O00
OO000OOO00
OO0OOO0O00
OOO00OOO00
O000O00O00
是不是就是相对应于前面列出来的那个类的各字属性?

此问题加分到100,如果这个问题解决了。我再散200分,因为这个问题我已经搞了快一个月了。为了只是想得到那全国100多个城市的地图。:)
cql0007 2003-12-01
  • 打赏
  • 举报
回复
现在才明白你的意思了.
O00OOO000O = (O00O00O000)objectinputstream.readObject();这句中,readObject()方法返回的是一个Object类型,(O00O00O000)就是将这个读出来的对象强制转换成他写入文件时存入的对象类型了,也就是转换成这个对象的本来的对象类型.那个对象类型也就是他自己定义的上面楼上列出来的那个类.
cllxyuer 2003-12-01
  • 打赏
  • 举报
回复
这些是不是对像序列化的问题?

就当前这个问题,里面所对的对象的结构是不是上面所提到的那个(天字写成的)类的结构?

忘记说明一个存在的问题:那个ZIP包中,有两个文件(或叫做zipentry),我用解压的文件都打不开。用zipinputstream可以读出里面的zipentry名称,也能读些数据如下:

下面是文本文件方面的:
______________________________________________________________________________
 sr O0OO0000O0.O00O00O000僂=r:*箥 I
O0000OOO00I
O0O00OOO00I
OO000O0O00I
OO000OOO00I
OO0OOO0O00I
OOO00OOO00[
O000O00O00t [F[
O000OOO000t [B[
O00O000O00q ~ [
O00O0O0O00t [I[
O00OO00O00q ~ [
O00OOOO000q ~ [
O0O00O0O00q ~ [
O0O0O0OO00q ~ [
O0O0OO0O00q ~ [
O0O0OOOO00t [Ljava/lang/String;[
O0OO0OO000q ~ [
O0OOOOOO00q ~ [
OO000000O0q ~ [
OO0OO00O00q ~ [
OOO0000O00q ~ [
OOO00O0O00q ~ [
OOO0OOOO00q ~ [
OOOO000O00q ~ [
OOOOOOO000q ~ [
OOOOOOOO00q ~ xp G?鳕 ] ^?ur [F渷??B xp b ur [B?T? xp ^ uq ~ b ur [IM篳&v瓴? xp ^ @@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@@?@牋 @€?@€?@€?uq ~ ^F尃 F尃 Fj` Fj` Fj` Fj` Fj` D F@ FK D E D D F@ E淍 E淍 E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ Ez It$ E诶 Ez E诶 E;€ 縺 縺 縺 縺 E E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ E;€ uq ~ ^uq ~
cllxyuer 2003-12-01
  • 打赏
  • 举报
回复
(大家别晕,都是数字0-零和字母O-欧)很像在看天书(机器码还没这么难看)。

还有另外一句:
O00OOO000O = (O00O00O000)objectinputstream.readObject();

是不是强制类型转换?
为什么我在readObject();老是提示出错。
cql0007 2003-12-01
  • 打赏
  • 举报
回复
ObjectInputStream是对象流,它原来存在文件中的内容是一个个对象时,读的时候就要用这个流读出来
cllxyuer 2003-12-01
  • 打赏
  • 举报
回复
初步理解了。

我反编译了另一个class的,已经被再加密了(大部分类名,变量,方法都是0和o的组合)。下面有一个我不知道他们的功能是什么:
ObjectInputStream objectinputstream = new ObjectInputStream(zipinputstream);
是不是将当前的zipentry转成ObjectInputStream对像?ObjectInputStream是干嘛的?查书查不到啊。

还有另外一句:
O00OOO000O = (O00O00O000)objectinputstream.readObject();
^^^^^^^^^^这个类在下面定义

________________________________________________________________
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi
// Source File Name: O00O00O000.java

package O0OO0000O0;

import java.io.Serializable;

public class O00O00O000
implements Serializable
{

public int O0O00OOO00;
public int OOO00OOO00;
public int O0000OOO00;
public int OO000OOO00;
public int OO0OOO0O00;
public int OOO00O0O00[];
public String O0OOOOOO00[];
public String OOOOOOOO00[];
public int O0O00O0O00[];
public int O00O0O0O00[];
public int O0O0O0OO00[];
public String O0O0OOOO00[];
public float OOOO000O00[];
public float O000O00O00[];
public float OOO0000O00[];
public float O00O000O00[];
public byte OOOOOOO000[];
public float OO0OO00O00[];
public float O00OO00O00[];
public String OOO0OOOO00[];
public String OO000000O0[];
public byte O000OOO000[];
public byte O00OOOO000[];
public int O0O0OO0O00[];
public byte O0OO0OO000[];
public int OO000O0O00;

public O00O00O000()
{
O0O00OOO00 = 0x77359400;
OOO00OOO00 = 0x77359400;
O0000OOO00 = 0x88ca6c00;
OO000OOO00 = 0x88ca6c00;
OO0OOO0O00 = 0;
OOO00O0O00 = new int[1];
O00O0O0O00 = new int[1];
O0O0O0OO00 = new int[1];
O0OOOOOO00 = new String[1];
OOOOOOOO00 = new String[1];
OO000000O0 = new String[1];
O000OOO000 = new byte[1];
O0O00O0O00 = new int[1];
O0O0OOOO00 = new String[1];
OOOO000O00 = new float[1];
O000O00O00 = new float[1];
OOO0000O00 = new float[1];
O00O000O00 = new float[1];
OOOOOOO000 = new byte[1];
OO0OO00O00 = new float[1];
O00OO00O00 = new float[1];
OOO0OOOO00 = new String[1];
O00OOOO000 = new byte[1];
O0O0OO0O00 = new int[1];
O0OO0OO000 = new byte[1];
}
}

cql0007 2003-12-01
  • 打赏
  • 举报
回复
呵呵,楼主啊,zipentry这个东东你没理解清楚,和我开始一样,:)
System.out.println(zipentry.getName());
System.out.println(zipentry.isDirectory());
System.out.println(zipentry.STORED);
System.out.println(zipentry.getSize());
System.out.println(zipentry.getCompressedSize());
System.out.println(zipentry.getCrc());

zipentry是获取压缩包里的一个实体,用了它后,指针指向压缩文件里的第一个文件.
所以你的问题在于:
1.如果不用它,指针并没有移向具体的文件实体去,所以就为空.
2.向你上面的那样打印,用一次zipentry后,就往后取一个压缩实体,用一次又往后取一个,当然不是你所期待的结果了.
qljsd 2003-12-01
  • 打赏
  • 举报
回复
这是我刚写的测试类,编译运行都OK

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

class Test {
public static void main(String[] args) {
try {
ZipInputStream zipInStream = new ZipInputStream( new BufferedInputStream(new FileInputStream("qlj.zip") ) );
byte[] bs = new byte[1024];

ZipEntry ze = null;
while( ( ze = zipInStream.getNextEntry() ) != null ) {
System.out.println(ze.getName());
System.out.println(ze.isDirectory());
System.out.println(ze.STORED);
System.out.println(ze.getSize());
System.out.println(ze.getCompressedSize());
System.out.println(ze.getCrc());
}

//new Test().RelativeDate(new Date(), 3);
} catch(Exception e) {
e.printStackTrace();
}
}

}

62,614

社区成员

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

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