【java课设+源代码+注释+文档】文件加密

项目文档见我上传的资源

点击这里下载资源

package xyz.slienceme;
/*
 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates
 * and open the template in the editor.

 */

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 * @Author slience_me
 * @Time : 2021/5/5  19:36
 * @File : Encrypt.java
 * @Software : IntelliJ IDEA
 */
public class Encrypt extends javax.swing.JFrame {

    /**
     * Creates new form Encrypt
     */
    public Encrypt() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.

     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.

     */
    @SuppressWarnings("unchecked")
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        savePathTxt = new javax.swing.JTextField();
        savePathBtn = new javax.swing.JButton();
        filePathBtn = new javax.swing.JButton();
        SimEncryBtn = new javax.swing.JButton();
        ComDecryBtn = new javax.swing.JButton();
        SimDecryBtn = new javax.swing.JButton();
        ComEncryBtn = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        filePathTxt = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        savePathTxt.setToolTipText("");
        savePathTxt.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                savePathTxtActionPerformed(evt);
            }
        });

        savePathBtn.setText("保存路径:");
        savePathBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                savePathBtnActionPerformed(evt);
            }
        });

        filePathBtn.setText("文件路径:");
        filePathBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                filePathBtnActionPerformed(evt);
            }
        });

        SimEncryBtn.setText("简单加密");
        SimEncryBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SimEncryBtnActionPerformed(evt);
            }
        });

        ComDecryBtn.setText("复杂解密");
        ComDecryBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ComDecryBtnActionPerformed(evt);
            }
        });

        SimDecryBtn.setText("简单解密");
        SimDecryBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SimDecryBtnActionPerformed(evt);
            }
        });

        ComEncryBtn.setText("复杂加密");
        ComEncryBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ComEncryBtnActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 18)); // NOI18N
        jLabel1.setText("文件加密小助手");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(54, 54, 54)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(filePathBtn)
                            .addComponent(savePathBtn))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(filePathTxt, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(savePathTxt, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 337, Short.MAX_VALUE)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(209, 209, 209)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(75, 75, 75)
                        .addComponent(SimEncryBtn)
                        .addGap(27, 27, 27)
                        .addComponent(SimDecryBtn)
                        .addGap(18, 18, 18)
                        .addComponent(ComEncryBtn)
                        .addGap(18, 18, 18)
                        .addComponent(ComDecryBtn)))
                .addContainerGap(57, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addComponent(jLabel1)
                .addGap(39, 39, 39)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(savePathTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(savePathBtn))
                .addGap(33, 33, 33)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(filePathBtn)
                    .addComponent(filePathTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(40, 40, 40)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(SimEncryBtn)
                    .addComponent(SimDecryBtn)
                    .addComponent(ComEncryBtn)
                    .addComponent(ComDecryBtn))
                .addContainerGap(89, Short.MAX_VALUE))
        );

        pack();
    }// //GEN-END:initComponents

    private void savePathTxtActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_savePathTxtActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_savePathTxtActionPerformed

    private void filePathBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filePathBtnActionPerformed
        // TODO add your handling code here:
        // TODO add your handling code here:
        JFileChooser jfc = new JFileChooser();// 文件选择器
        // 设定只能选择到文件夹
        jfc.setFileSelectionMode(0);
        // 此句是打开文件选择器界面的触发语句
        jfc.setCurrentDirectory(new File("D://1Amycode//Java//CourseDesign"));
        int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句
            if (state == 1) {
                return;// 撤销则返回
            } else {
                File f = jfc.getSelectedFile();//
                filePathTxt.setText(f.getAbsolutePath());
            }
    }//GEN-LAST:event_filePathBtnActionPerformed

    private void SimEncryBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SimEncryBtnActionPerformed
        // TODO add your handling code here:

            String newpath = savePathTxt.getText().trim();
            System.out.println("SimEncryBtnActionPerformed=" + newpath);
            String oldpath = filePathTxt.getText().trim();
            System.out.println("SimEncryBtnActionPerformed=" + oldpath);

            if (newpath.equals("")) {
                JOptionPane.showMessageDialog(null, "请选择输出路径!", "提示", 2);
            } else if (filePathTxt.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "请选择文件!", "提示", 2);
            } else {
                File file = new File(oldpath);
                //文件类型
                String filetype=file.getName().substring(file.getName().lastIndexOf("."),file.getName().length());
                System.out.println("filetype=" + filetype);
                //文件前缀
                String fileprefix=file.getName().substring(0,file.getName().lastIndexOf("."));
                System.out.println("fileprefix=" + fileprefix);
                String newFilepath = newpath + "\\"+ "SimEncrypt" + fileprefix + filetype;
                System.out.println("newFilepath=" + newFilepath);
                if (!file.exists()) {
                    try {
                        file.createNewFile();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        JOptionPane.showMessageDialog(null, "路径不正确!", "提示", 2);
                    }
                }
//                creatPath(newpath);//检查路径是否存在,不存在创建新路径
                try {
                    SimEncryption(oldpath, newFilepath);
                } catch (IOException ex) {
                    Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
                }

                JOptionPane.showMessageDialog(null, "简单加密完成!", "提示", 2);
            }
    }//GEN-LAST:event_SimEncryBtnActionPerformed

    private void savePathBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_savePathBtnActionPerformed
        // TODO add your handling code here:
        JFileChooser jfc = new JFileChooser();// 文件选择器
        // 设定只能选择到文件夹
        jfc.setFileSelectionMode(1);
        // 此句是打开文件选择器界面的触发语句
        jfc.setCurrentDirectory(new File("D://1Amycode//Java//CourseDesign"));
        int state = jfc.showOpenDialog(null);
            if (state == 1) {
                return;
            } else {
                File f = jfc.getSelectedFile();// f为选择到的目录
                savePathTxt.setText(f.getAbsolutePath());
            }
    }//GEN-LAST:event_savePathBtnActionPerformed

    private void ComDecryBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ComDecryBtnActionPerformed

            String newpath = savePathTxt.getText().trim();
            System.out.println("ComEncryBtnActionPerformed=" + newpath);
            String oldpath = filePathTxt.getText().trim();
            System.out.println("ComEncryBtnActionPerformed=" + oldpath);

            if (newpath.equals("")) {
                JOptionPane.showMessageDialog(null, "请选择输出路径!", "提示", 2);
            } else if (filePathTxt.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "请选择文件!", "提示", 2);
            } else {
                File file = new File(oldpath);
                //文件类型
                String filetype=file.getName().substring(file.getName().lastIndexOf("."),file.getName().length());
                System.out.println("filetype=" + filetype);
                //文件前缀
                String fileprefix=file.getName().substring(0,file.getName().lastIndexOf("."));
                System.out.println("fileprefix=" + fileprefix);
                String newFilepath = newpath + "\\"+ "ComDe_" + fileprefix + filetype;
                System.out.println("newFilepath=" + newFilepath);
                if (!file.exists()) {
                    try {
                        file.createNewFile();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        JOptionPane.showMessageDialog(null, "路径不正确!", "提示", 2);
                    }
                }
//                creatPath(newpath);//检查路径是否存在,不存在创建新路径
                try {
                    ComDecryption(oldpath, newFilepath);
                } catch (IOException ex) {
                    Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
                }

                JOptionPane.showMessageDialog(null, "复杂解密完成!", "提示", 2);
            }
    }//GEN-LAST:event_ComDecryBtnActionPerformed

    private void SimDecryBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SimDecryBtnActionPerformed
        // TODO add your handling code here:
        // 存储的位置
        String newpath = savePathTxt.getText().trim();
        System.out.println("SimEncryBtnActionPerformed=" + newpath);
        // 加密的文件
        String oldpath = filePathTxt.getText().trim();
        System.out.println("SimEncryBtnActionPerformed=" + oldpath);

        if (newpath.equals("")) {
                JOptionPane.showMessageDialog(null, "请选择输出路径!", "提示", 2);
            } else if (filePathTxt.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "请选择文件!", "提示", 2);
            } else {
                File file = new File(oldpath);
                //文件类型
                String filetype=file.getName().substring(file.getName().lastIndexOf("."),file.getName().length());
                System.out.println("filetype=" + filetype);
                //文件前缀
                String fileprefix=file.getName().substring(0,file.getName().lastIndexOf("."));
                System.out.println("fileprefix=" + fileprefix);
                String newFilepath = newpath + "\\"+ "SimDe_" + fileprefix+ filetype;
                System.out.println("newFilepath=" + newFilepath);
                if (!file.exists()) {
                    try {
                        file.createNewFile();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        JOptionPane.showMessageDialog(null, "路径不正确!", "提示", 2);
                    }
                }
                creatPath(newpath);//检查路径是否存在,不存在创建新路径
                try {
                    SimDecryption(oldpath, newFilepath);
                } catch (IOException ex) {
                    Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
                }
            JOptionPane.showMessageDialog(null, "简单解密完成!", "提示", 2);
        }
    }//GEN-LAST:event_SimDecryBtnActionPerformed

    private void ComEncryBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ComEncryBtnActionPerformed

        // 存储的位置
        String newpath = savePathTxt.getText().trim();
        System.out.println("ComEncryBtnActionPerformed=" + newpath);
        // 加密的文件
        String oldpath = filePathTxt.getText().trim();
        System.out.println("ComEncryBtnActionPerformed=" + oldpath);

        if (newpath.equals("")) {
                JOptionPane.showMessageDialog(null, "请选择输出路径!", "提示", 2);
            } else if (filePathTxt.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "请选择文件!", "提示", 2);
            } else {
                File file = new File(oldpath);
                //文件类型
                String filetype=file.getName().substring(file.getName().lastIndexOf("."),file.getName().length());
//                System.out.println("filetype=" + filetype);
                //文件前缀
                String fileprefix=file.getName().substring(0,file.getName().lastIndexOf("."));
//                System.out.println("fileprefix=" + fileprefix);
                String newFilepath = newpath + "\\"+ "ComEncrypt" + fileprefix + filetype;
//                System.out.println("newFilepath=" + newFilepath);
                if (!file.exists()) {
                    try {
                        file.createNewFile();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        JOptionPane.showMessageDialog(null, "路径不正确!", "提示", 2);
                    }
                }
                creatPath(newpath);//检查路径是否存在,不存在创建新路径
                try {
                    ComEncryption(oldpath, newFilepath);
                } catch (IOException ex) {
                    Logger.getLogger(Encrypt.class.getName()).log(Level.SEVERE, null, ex);
                }
            JOptionPane.showMessageDialog(null, "复杂加密完成!", "提示", 2);
        }
    }//GEN-LAST:event_ComEncryBtnActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Encrypt.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Encrypt.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Encrypt.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Encrypt.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Encrypt().setVisible(true);
            }
        });
    }

    //根据路径处理,如果不存在创建路径
    public void creatPath(String oldpath) {
        String temppath = oldpath.replace(oldpath.substring(oldpath.lastIndexOf("\\"), oldpath.length()), "");
        File file = new File(temppath);
        if (!file.exists()) {
            file.mkdir();
            System.out.println("路径不存在,但是已经成功创建了" + temppath);
        }
    }

    public void SimEncryption(String oldpath, String newpath) throws IOException {
        // 文件路径
        File file = new File(oldpath);
        // 输入流
        FileInputStream inputFile = new FileInputStream(file);
        // 输出流
        FileWriter fw = new FileWriter(newpath);
        byte[] buffer = new byte[(int) file.length()];
        // read(byte[] b)方法:从此输入流中将最多b.length个字节的数据读入一个字节数组中
        inputFile.read(buffer);
        inputFile.close();
        for (int i = 0; i < buffer.length; i++) {
//            System.out.println(buffer[i]);
            buffer[i] += 3;
            fw.write(buffer[i]);
        }
        fw.close();
    }

    public void SimDecryption(String oldpath, String newpath) throws IOException {
        // 文件路径
        File file = new File(oldpath);
        // 输入流
        FileInputStream inputFile = new FileInputStream(file);
        // 输出流
        FileWriter fw = new FileWriter(newpath);
        byte[] buffer = new byte[(int) file.length()];
        // read(byte[] b)方法:从此输入流中将最多b.length个字节的数据读入一个字节数组中
        inputFile.read(buffer);
        inputFile.close();
        for (int i = 0; i < buffer.length; i++) {
//            System.out.println(buffer[i]);
            buffer[i] -= 3;
            fw.write(buffer[i]);
        }
        fw.close();
    }

    public void ComEncryption(String oldpath, String newpath) throws IOException {
        // 文件路径
        File file = new File(oldpath);
        // 输入流
        FileInputStream inputFile = new FileInputStream(file);
        // 输出流
        FileWriter fw = new FileWriter(newpath);
        byte[] buffer = new byte[(int) file.length()];
        // read(byte[] b)方法:从此输入流中将最多b.length个字节的数据读入一个字节数组中
        inputFile.read(buffer);
        inputFile.close();
        String string = new String(buffer);
        String result = "";
        System.out.println("string="+ string.toString());

        for (int i = 0; i < string.length(); i++) {
            char x = string.toString().charAt(i);
            if(x >= 'a' && x = 'n' && x = 'A' && x = 'N' && x ='0' && x='6' && x

Original: https://www.cnblogs.com/Slience-me/p/16341903.html
Author: Slience_me
Title: 【java课设+源代码+注释+文档】文件加密

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585855/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 网络设备配置–6、通过RIP协议配置动态路由

    一、前言 同系列前几篇:网络设备配置–1、配置交换机enable、console、telnet密码网络设备配置–2、通过交换机划分vlan网络设备配置&#8…

    Linux 2023年6月8日
    0126
  • 2020年12月-第02阶段-前端基础-CSS Day07

    CSS Day07 CSS高级技巧 *理解 能说出元素显示隐藏最常见的写法能说出精灵图产生的目的能说出去除图片底侧空白缝隙的方法 *应用 能写出最常见的鼠标样式能使用精灵图技术能用…

    Linux 2023年6月8日
    0155
  • Linux基础学习(四)

    自建yum仓库,分别为网络源和本地源 1.本地源 点击查看代码 root@ct7:~# yum install autofs root@ct7:~# systemctl enabl…

    Linux 2023年6月8日
    0155
  • Linux基础入门笔记

    Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统,是一…

    Linux 2023年6月14日
    092
  • linux ssh连接自动断开问题

    场景描述:云上的虚拟机使用public ip连接ssh时,一直提示已经连接,但是就会自动关闭 通过正常虚拟机作为跳板,能够连接到目标机子上,检查发现进程正常,但是就一直连接不上 发…

    Linux 2023年6月7日
    0110
  • Java秒杀系统一:环境搭建和DAO层设计

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0145
  • vsftpd 操作手册-完整版

    vsftpd 目录 – ftp 简介 – vsftpd 简介 – vsftpd 安装&卸载 – vsftpd 配置文件 – vsftpd 认证模板 – vsftpd 配置模…

    Linux 2023年6月13日
    0109
  • Spring5新特性—Log4j2

    Spring5新特性—Log4j2 Spring5新特性—Log4j2 创建一个Maven项目,导入依赖 org.apache.logging.log4j log4j-core 2…

    Linux 2023年6月14日
    0114
  • golang的超时处理使用技巧

    大家知道Select 是 Go 中的一个控制结构,每个 case 必须是一个通信操作,要么是发送要么是接收操作。 select是 随机执行一个可运行的 case。 如果没有 cas…

    Linux 2023年6月6日
    087
  • python实现Mysql数据库批量新增数据

    一、批量插入数据的场景 二、插入数据的工具选择 三、选择Python进行批量插入 Python实现批量插入Mysql数据库数据 一、批量插入数据的场景 在进行数据压力时需要进行大数…

    Linux 2023年6月14日
    0104
  • 性能瓶颈分析与调优

    对于性能测试,很多时候压力并不能完全到达服务端,在客户端、网络连接端都有可能被阻塞,或者压测的某些特征符合CC和DDoS的行为,触发了防护策略导致压测结果达不到预期。 以下是各节点…

    Linux 2023年6月8日
    0129
  • SSH免密登录的配置

    ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录(免密) 大部分情况我们选择都是输入密码登录,平常使用暂时没有遇到什么问题。最近我编写了一些使用scp来传输文件的脚本,…

    Linux 2023年6月6日
    082
  • 雷霆传奇H5光柱版游戏详细图文架设教程

    前言 想体验经典传奇的热血PK吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品炫酷时装、坐骑、翅膀、宠物通通给你,就在光柱版雷霆传奇H5! 本文讲解雷霆传奇架设…

    Linux 2023年6月7日
    0171
  • 你真的了解JAVA中对象和类、this、super和static关键字吗

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 Java对象究竟是什么? 创建…

    Linux 2023年6月6日
    0150
  • Golang 实现 Redis(11): RDB 文件格式

    RDB 文件使用二进制方式存储 Redis 内存中的数据,具有体积小、加载快的优点。本文主要介绍 RDB 文件的结构和编码方式,并借此探讨二进制编解码和文件处理方式,希望对您有所帮…

    Linux 2023年5月28日
    0130
  • 实现批量自动部署Linux操作系统

    实战描述: xxx公司所服务的用户IT环境中有很多的Linux系统,品种也五花八门,有RHEL、Centos、OpenSUSE甚至还有测试环境使用的RockyLinux。当有大量的…

    Linux 2023年6月7日
    0129
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球