我有一个需求,要自定义一种基于数据流的数据存储格式,这种文件的数据格式是这样的:
数据是一段一段地存入文件的,每段之间的间隔标志就是下一段数据的长度,比如我要存入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长度,为什么就出错了呢?百撕不得骑姐啊