您的位置:首页 > 编程语言 > Java开发

Java采用readInt()方法直接读取特定的ZIP压缩文件出现了奇怪的问题

2013-09-03 19:23 656 查看
我有一个需求,要自定义一种基于数据流的数据存储格式,这种文件的数据格式是这样的:

数据是一段一段地存入文件的,每段之间的间隔标志就是下一段数据的长度,比如我要存入3段数据,它们的长度是{2234,3343,2321}

那么就按照 {2234}{2234字节的数据段}{3343}{3343字节的数据段}{2321}{2321字节的数据段} 这样的拼接格式存入文件。

具体写入方法是:先用writeInt()方法写入数据的长度,再用write()写入此长度的具体数据。

在读取这个文件时,将文件存入DataInputStream(),然后先用readInt()读取数据的长度,再用read()方法读出指定长度的数据,直接读取这个文件时一点问题也没与。

后来考虑到数据量大的时候必须要压缩,因此就用ZIP类自定义了一个压缩的方法,成功的将文件打包。之后读取文件的时候我不想先把文件解压出来再读,那样效率太低了,于是想直接从ZIP压缩文件里读取数据,核心方式是这样

zf = new ZipFile(path);//压缩文件
Din=new DataInputStream(zf.getInputStream(zf.getEntry("ex_A.vjpeg")));//压缩文件里的自定义格式文件

//...
Byte[] data = new Byte[SIZE];
int len = Din.readInt();
Din.read(data,0,len);


这个是很常规的方法,但是在读取了前两段数据后,readInt()的值马上就变成负的或者非常大的值,然后就抛出异常了。

后来,我把读取的方法改成:

byte[] a = new byte[1];
len = Din.readInt();
for(int i=0;i<len;i++)
{
a[0] = Din.readByte();
System.arraycopy(a, 0, data, i, 1);
}


问题就解决了。

但是我真搞不懂,这两种方法根本就没有区别嘛,read(data,0,len)将len长度的数据写到data里去,跳过len长度, 而调用len次 readByte() 方法将数据写入data,也是跳过len长度,为什么就出错了呢?百撕不得骑姐啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐