Cony_14 2016-03-15 10:24 采纳率: 50%
浏览 1316
已结题

新手请教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");
    }

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-03-15 10:37
    关注

    看你的目标文件,也不是什么数量+00啊,而且你的山寨压缩算法存在问题,比如010100到底是01后面接1个00还是0101个00呢?找一本初级数据结构的教材,把哈夫曼编码的概念先看看吧。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!