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压缩文件里读取数据,核心方式是这样
这个是很常规的方法,但是在读取了前两段数据后,readInt()的值马上就变成负的或者非常大的值,然后就抛出异常了。
后来,我把读取的方法改成:
问题就解决了。
但是我真搞不懂,这两种方法根本就没有区别嘛,read(data,0,len)将len长度的数据写到data里去,跳过len长度, 而调用len次 readByte() 方法将数据写入data,也是跳过len长度,为什么就出错了呢?百撕不得骑姐啊
数据是一段一段地存入文件的,每段之间的间隔标志就是下一段数据的长度,比如我要存入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长度,为什么就出错了呢?百撕不得骑姐啊
相关文章推荐
- java 利用POI读取execel文件时出现 Unable to read entire header; 0 bytes read; expected 512 bytes 的解决方法
- Java中long类型直接赋值出现The literal xxxxxxxxxx of type int is out of range 问题的原因和解决方法
- java直接读取.zip压缩文件(一)
- 安卓(JAVA)读取Mp3文件中的歌曲信息(及readLine()出现乱码问题的解决方法)
- Java:InputStream读取文本文件内容出现乱码问题的解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- 非java.util.zip,使用ant.jar制作zip压缩文件,以及相关中文解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java中从txt文件中读取和存储内容出现乱码的解决方法
- JAVA读取zip文件 JAVA读取压缩文件 解压zip里面的指定格式文件
- 用java中的java.util.zip包读取压缩文件
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- java中读取excel文件中字符串乱码问题解决方法
- Java-zip压缩文件乱码问题
- java读取zip文件和压缩zip文件
- bash 中 while读取文件并通过 ssh执行命令出现的问题及解决方法
- java解压zip或rar压缩文件(有源码和jar包以及对中文乱码的处理方法)
- JAVA实现压缩文件的方法(使用java.util.zip.*)
- (Java控制台程序版)递归打包整个父文件夹下的文件和子文件夹成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法