二进制-新手请教java文件操作的一个小问题~十分感谢

问题描述

新手请教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

二进制-新手请教java文件操作的一个小问题~十分感谢的相关文章

新手学习JAVA核心技术时的一个小问题 关于static和void

问题描述 核心技术第八版:112页静态方法是什么意思:因为在做119页的例题时System.out.println("Swap:");Employeea=newEmployee("zha",100);Employeeb=newEmployee("xin",1000);swap(a,b);publicswap(Employeex,Employeey){Employeetemp=x;x=y;y=temp;System.out.println(&quo

请教前辈们java文件操作小生的一个疑惑

问题描述 请教前辈们java文件操作小生的一个疑惑 不明白为什么程序执行后temp和二进制值对应不上,且到循环第四次是没有输出temp=0执行了 这是待处理文件的16进制代码 这是输出 import java.io.*; public class test1 { public static void main(String args[]) throws Exception { FCompression(); } public static void FCompression()throws Ex

java文件操作大全

java文件操作大全 文件的建立/检查与删除<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.io.*"%><html><head><title>文件的建立.检查与删除</title></head><body><%String path=request.getRealPath

java文件操作及缓存机制依旧有瓶颈

我们在使用windows系统时发现,复制一个文件的再粘贴的速度大体上是一致的,我们可以猜想这是微软内部的工作人员设计的一个算法,而这个操作所能实现的最大速度是由什么影响的呢?? 那么我们可不可以自己设计一个方法来代替windows自带的复制粘贴方法来达到更快的传输速度呢?? 下面的一段代码就以缓冲的形势来实现了文件的copy工作: publicvoid copybyte(String srcFile,String destFile)throws IOException{ //创建输入流 Inpu

请教java线程使用的一个问题

问题描述 请教java线程使用的一个问题 在web项目中.假设在页面上点了A按钮,然后后台某种需求,新建了A线程,干某件事.过了一会儿.我再点A按钮,又会启动一个新线程,干同一件事.请问一下,这样做好不好?或者说在后面点A按钮的时候,直接使用A线程干事而不是重新创建.请问这样做行不行?行的话怎么弄.谢谢 解决方案 看你的线程是干嘛用的.如果你的线程只有一个单一的事件待解决(比如说要执行一个大量计算的函数,但不想阻塞主界面),这样做可以,但是这时候可能使用线程池更适合.如果你的线程是要一直活着并长

关于java问题-有关java文件操作的问题

问题描述 有关java文件操作的问题 有一个java程序, 就是统计幼儿园小朋友需要的铅笔(一支铅笔2元)的总价 我已经用面向对象的思想实现了这个程序, 程序输出是一行行的 姓名 年纪 需要铅笔的数目 某小朋友总价 最后输出所有的价格 (例如 小明 4 5 10元 小李 5 4 8元 ......) 现在需要从文件读取一行行的信息(就是上面的格式),并计算总价,这个该怎么做? 解决方案 你好,,根据你的需求,,我是写了一个实体类,,然后用list遍历输出,,代码如下: public class

java-为什么这段代码if里面的语句不会执行,ext.txt文件和该Java文件下同存在一个文件夹下

问题描述 为什么这段代码if里面的语句不会执行,ext.txt文件和该Java文件下同存在一个文件夹下 public static void main(String [] args){ File file=new File("ext.txt"); if(file.isFile()){ System.out.println("绝对路径:"+file.getAbsolutePath()); System.out.println("文件长度:"+fil

遍历-java递归删除目录的一个小问题

问题描述 java递归删除目录的一个小问题 import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; public class DeleteFilesDemo { public static void main(String[] args) throws FileNo

Java初学一枚 一个小程序 求有人帮我看看

问题描述 Java初学一枚 一个小程序 求有人帮我看看 package malnAV; public class Work3_3 { public static void main(String[] args) { //??? //方法 main 不能声明为"静态":只能在静态类型或顶级类型中才能声明静态方法 Emp e1=new Emp(001,"张三"); Emp e2=new Emp(002,"李四"); Emp e3=new Emp(00