问题描述
- 新手请教java文件操作的一个小问题~十分感谢
-
这个类的功能是将任意一个二进制文件中的0压缩成0的数目+0的形式
即:将二进制文件中16进制显示的00压缩成 "0的数目+00的形式"
如00 00 00 1A 压缩成03 00 1A
待压缩文件16进制内容:
代码执行后后生成的文件却成了如图所示的情况
求教什么地方出错了,万分感谢。import java.io.*; public class FileCompression { public static void main(String args[]) throws Exception { FCompression(); } //将二进制文件中16进制显示的00压缩成 "0的数目+00的形式" //如00 00 00 1A 压缩成03 00 1A public static void FCompression()throws Exception { File dFile=new File("E:/Picture Collections/dest.cpac");//压缩生成目标文件 File file = new File("E:/Picture Collections/dest.pac");//待压缩文件 FileInputStream fin=new FileInputStream(file); BufferedInputStream bin=new BufferedInputStream(fin); PushbackInputStream pbin=new PushbackInputStream(bin); //DataInputStream din=new DataInputStream(fin); FileOutputStream fout = new FileOutputStream(dFile,true); DataOutputStream dout=new DataOutputStream(fout); byte[] bt=new byte[1]; int len=0; int i=0;//i代表00 的数目 1byte=2个16进制位 int temp; while( (len = fin.read(bt)) != -1 ) { if (bt[0]==0&&(temp=pbin.read())==0)//若读取的数和它后的数字都为0则跳过 { pbin.unread(temp);//推回预读的下一位 i++; //调试语句System.out.println("--"+i); } else if (bt[0]==0&&(temp=pbin.read())!=0)//若读取的数为0,但它后的数不为0 { pbin.unread(temp); i++; //调试语句System.out.println("+++++++"); dout.writeByte(i);//写入00 的个数 dout.writeByte(0);//写入0 i=0;//重置i } else { //调试语句System.err.println("----"); fout.write(bt,0,len); } } dout.close(); pbin.close(); System.out.println("Compress successfully"); } }
解决方案
看你的目标文件,也不是什么数量+00啊,而且你的山寨压缩算法存在问题,比如010100到底是01后面接1个00还是0101个00呢?找一本初级数据结构的教材,把哈夫曼编码的概念先看看吧。
时间: 2024-08-01 06:52:07