2 cony 14 Cony_14 于 2016.03.15 18:24 提问

新手请教java文件操作的一个小问题~十分感谢 1C

这个类的功能是将任意一个二进制文件中的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个回答

caozhy
caozhy   Ds   Rxr 2016.03.15 18:37

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

Cony_14
Cony_14 初学java的文件操作,老师要求自己实现一个简单的压缩功能。01 01 00 是压缩成01 01 01(数目) 00,对,算法存在问题,这样的确增加了长度,我会慢慢改进算法,但是输出的文件和理想文件大不相同,想问问前辈问题出在那呀
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!