首页 > 编程语言 >java-文件编码

java-文件编码

时间:2024-11-10 08:50:01浏览次数:3  
标签:sort 编码 java 文件 patchwork enumeration Reconstitution new public

package code;


import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

public class Operation {
    private static List<Reconstitution> sort;
    private static byte[] buffer;

    public static void main(String[] args) throws Exception {
        String inputPath = "C:\\Users\\Administrator\\Desktop\\InputTest.jpg";
        Operation o = new Operation();
        o.prepar(inputPath);
        Start();

    }

    private void prepar(String inputPath) throws Exception {

        //建立缓冲区
        Path file = Paths.get(inputPath);
        byte[] buffer = Files.readAllBytes(file);

        //统计
        Map<Byte, Integer> count = new HashMap<>();
        for (byte individually : buffer) {
            Integer head = count.get(individually); //有没有
            if (head == null) {
                count.put(individually, 1);//第一次统计
            } else {
                count.put(individually, head + 1);
            }
        }

        //排序
        List<Reconstitution> sort = new ArrayList<>();
        for (Map.Entry<Byte, Integer> apart : count.entrySet()) {//允许对一对数据操作
            Reconstitution reconstitution = new Reconstitution(apart.getKey(), apart.getValue());
            sort.add(reconstitution);
        }
        Collections.sort(sort);

        //种树
        while (sort.size() > 1) {
            //次数
            Reconstitution thisWay = sort.get(0);
            Reconstitution thatWay = sort.get(1);
            int enumeration = thisWay.enumeration + thatWay.enumeration;

            //重构为倒Y
            Reconstitution upper = new Reconstitution(null, enumeration);
            upper.thisWay = thisWay;
            upper.thatWay = thatWay;

            //剪去首部,后面向前补,在尾部添加。逐层向上
            sort.remove(thisWay);
            sort.remove(thatWay);
            sort.add(upper);//我有一颗完整的树,劈开来拣到底的打印

        }
        this.sort = sort;
        this.buffer = buffer;
    }

    public static void Start() throws Exception {
        //获取路径
        Reconstitution root = sort.get(0);
        Encode patchwork = new Encode();
        Map<Byte, String> route = patchwork.patchwork(root);
        save(route);


        //转译
        StringBuilder ciphertext = new StringBuilder();//编码串
        for (byte tmpBuffer :
                buffer) {
            ciphertext.append(route.get(tmpBuffer));
        }
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\CodeTest2.txt",true);
        String st = new String(ciphertext);
        byte[] bt = st.getBytes();
        fileOutputStream.write(bt);
        fileOutputStream.flush();
        fileOutputStream.close();

    }

    private static void save(Map<Byte, String> route) throws  Exception {
//        保存路径
        for (Map.Entry<Byte, String> routesave:
             route.entrySet()) {
            FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\PathTest.txt",true);
            String str = "路径信息[byte="+routesave.getKey()+"];[path="+routesave.getValue()+")\n";
            byte[] bytes = str.getBytes();

            fileOutputStream.write(bytes);
            fileOutputStream.flush();
            fileOutputStream.close();
        }
    }

}

package code;

public class Reconstitution implements Comparable<Reconstitution> {
    Byte data; //文件内容
    int enumeration;//字符出现次数
    Reconstitution thisWay;//树状
    Reconstitution thatWay;

    public Reconstitution(Byte data, int enumeration){//对外放数据入口
        this.data = data;
        this.enumeration = enumeration;
    }


    @Override
    public int compareTo(Reconstitution o) {  //树状分层
        return this.enumeration - o.enumeration;
    }

    @Override
    public String toString() {//重构数据结构
        return "Nodedata["+"data=" + data + ",enumeration="+ enumeration+"]";
    }


    //树
    public void preOrder(){
        System.out.println(this);//回调函数打印
        if(this.thisWay != null){
            this.thisWay.preOrder();
        }
        if(this.thatWay != null){
            this.thatWay.preOrder();
        }
    }
    public static void preOrder(Reconstitution root){//从头看
        if (root != null){
            root.preOrder();
        }else{
            System.out.println("没有");
        }
    }
}
package code;


import java.util.HashMap;
import java.util.Map;


public class Encode {
    static Map<Byte, String> patchwork = new HashMap<>();//字节,路径
    static StringBuilder stringBuilder = new StringBuilder();//路径拼接

    //运树
    public static Map<Byte, String> patchwork(Reconstitution guidepost) {
        if (guidepost == null) {
            return null;
        }
        patchwork(guidepost.thisWay, "0", stringBuilder);
        patchwork(guidepost.thatWay, "1", stringBuilder);
        return patchwork;
    }

    //砍树
    public static void patchwork(Reconstitution guidepost, String code, StringBuilder stringBuilder) {
        StringBuilder dak = new StringBuilder(stringBuilder);
        dak.append(code);

        if (guidepost.data == null) {
            patchwork(guidepost.thisWay, "0", dak);
            patchwork(guidepost.thatWay, "1", dak);
        } else {//到底部了
            patchwork.put(guidepost.data, dak.toString());
        }
    }
}

标签:sort,编码,java,文件,patchwork,enumeration,Reconstitution,new,public
From: https://www.cnblogs.com/used-conduit-onion/p/18537600

相关文章

  • java-文件解码
    packageback;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.Map;publicclassBack{publicstaticvoidmain(String[]arg......
  • java-文件合并
    packagemerge;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.ArrayList;publicclassMerge{publicstat......
  • Java期末复习暨学校第二次上机课作业
    Java期末复习暨学校第二次上机课作业:了解程序的控制结构,掌握顺序结构程序的设计方法,掌握分支程序设计方法。第一题:闰年有两种判断方式:(1):能被4整除但不能被100整除(2):能被400整除输出结果:第二题:一个三位数求和,分别先把百位、十位、个位的数求出来再相加。百位:用给出......
  • 新手入门Java自动化测试的利器:Selenium WebDriver
    今天我们将深入探讨一款强大的Java自动化测试工具——SeleniumWebDriver。在正式介绍SeleniumWebDriver之前,让我们首先对Selenium本身进行简要概述,以便更好地理解其背景和功能。官方学习网站:https://www.selenium.dev/Selenium是一个开源的自动化测试框架,WebDriver是其核心......
  • 华为OD机试2024年E卷-MVP争夺战[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述在星球争霸篮球赛对抗赛中,最大的宇宙战队希望每个人都能拿到MVP,MVP的条件是单场最高分得分获得者。可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场,并且让所有得分的选手得分都相同,然而比赛过程中的每1分钟的得分都只能由某一个人包揽。输入描述输入第一行......
  • 华为OD机试2024年E卷-AI识别面板[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述AI识别到面板上有N(1≤N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),请输出先行后列排序的指示灯的编号,排序规则:每次在尚未排序的灯中挑选最高的......
  • 深入理解 Java 反射与泛型:类型擦除与强制类型转换
    深入理解Java反射与泛型:类型擦除与强制类型转换在Java编程中,反射(Reflection)和泛型(Generics)是两个强大且常用的特性。反射允许我们在运行时检查和操作类、方法、字段等,而泛型则允许我们编写更加通用和类型安全的代码。然而,Java的泛型机制与类型擦除(TypeErasure)密切相关,这使......
  • [Javaee]网络原理-https协议
    前言前面的文章,我们着重介绍了http协议相关的知识。【Javaee】网络原理—http协议(一)-CSDN博客【Javaee】网络原理-http协议(二)-CSDN博客http存在着安全问题(如运营商劫持),针对http的安全问题,我们引入了https进行解决。下面,将详细介绍https协议目录 一.https协议是什么......
  • Playwright使用Typescript实现在测试case文件中调用另一个文件中的方法
    前提:(1)安装了nodejs(2)创建了测试目录(3)使用Vscode安装了Playwright插件可以参考官方文档:https://playwright.dev/docs/getting-started-vscode 在vscode界面最左侧的按钮选择Explorer,创建一个与tests目录同级的目录methods,并在methods目录下创建文件method1.ts,目录结构如......
  • 五种编码模式
    ASCII编码和Hex编码ASCII编码:将所有的英文字符中标点符号、空格、数字、大小写字符可以表示为表示为0到127的十进制数字。Hex编码:将信息转化为十六进制,即每个字符的ASCII码的十六进制。使用8个比特位(即1个字节)存储字符,如同可见引用图片:来源https://www.asciim.cn/ASCII编......