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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
一个小问题请教
我在ASP.NET 中写了以下一段代码,protected System.Web.UI.WebControls.DataGrid DataGrid1;.........//提取数据库信息并绑定到DataGrid1;Response.Write(DataGrid1.DataKeys[0].ToString());在预览时却出现这样的错误提示信息:索引超出范围。必须为非负值并小于集合经我将DataKe
数组的两个小问题
1.不可以对数组名(指针常量)进行赋值操作2.对数组进行整体赋值只能在最初声明的时候进行。
请教一个问题(新手)
 今天跟着书做第一个例子,如下:private void Form1_Load(object sender, EventArgs e)        {           this.label1 .Text = "111";                }为什么label1前面要加this呀。不加的话就不要用。以前用VB的时候就没事呀。谢谢。现在在学习C#,用的也是。net中的C#
新手请教一个问题!
做完网站,测试正常,之后加了一个default.html作为flash引导页,这个页面中只有一个flash并在iis网站管理属性中-文件下也做了相应修改,当来浏览器中访问127.0.0.1时网页能打开,没有报错,但是页面上什么都没有,再去wwwroot下双击打开default.html时,一切正常,请教这是什么原因,谢谢! default页面代码如下: #warp 
数组操作的两个常见小问题
/* 数组操作的两个常见小问题: ArrayIndexOutOfBoundsException:数组索引越界异常 原因:你访问了不存在的索引。 NullPointerException:空指针异常 原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。 作用:请自己把所有的场景Exception结尾的问题总结一下。以后遇到就记录下来。  现象,原因,解决方案。 */
什么人适合学习Python,以及新手Python学习路线指导
0基础 逻辑思维能力强 如果你认为自己的逻辑思维能力很强, 想通过学一门技术来获得高薪能力, 那你不妨一试,很可能,这就是适合你的高薪之门。 数学/统计学/物理学专业 如果你大学学的是数学、大数据收集或分析、 统计学、物理学等相关方向, 那未来,注定你在这个领域表现不俗。 传统运维转开发 如果你之前从事的是运维工作遇到瓶颈想转开发岗位, 那Python将帮助你成功转型。 转型
请教一个小问题。太头疼
下面的代码,24小时后为啥不重置? 我是要求:24小时之内到这页面,如果visits3就显示stop。24小时后重新开始计算visits。 可是24小时之后,一直显示stop。 在这24小时之内,多次到这页面访问,也要不影响代码统计:以第一次到这页面开始计算。请高手帮我看看。 expdate.setTime(expdate.getTime()+(24*60*60*1000));
java中的数组的常见操作问题
数组操作常见操作     对数组操作最基本的动作就是存和取。     核心思想:就是对角标的操作。     示例:遍历并打印数组元素 class ArrayDemo{ public static void main(String[] args) { int[] arr = {89,34,270,17}; for
AMDD 一个把大问题分成小问题的优化算法
还没看懂,先记下地址“ 这个博客上有基础知识: http://www.cnblogs.com/breezedeus/p/3496819.html 下面是AMDD http://web.stanford.edu/~boyd/admm.html
十分感谢--致谢好友的
对于好友的关注十分感激  小财学历浅+刚来此处==不是十分懂知识难求,好友更难