• 【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)


    练习1:文件夹拷贝

    1.1 需求

    需求:拷贝一个文件夹,考虑子文件夹

    • 拷贝的文件夹:D:\QQ
    • 拷贝的位置:D:\File

    1.2 代码实现

    package text.IOStream.FileWrite.FileWrite02;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*拷贝
    需求:
        拷贝一个文件夹,考虑子文件夹
    
    拷贝的文件夹:D:\QQ
    拷贝的位置:D:\File
     */
    public class FileWrite02 {
        public static void main(String[] args) throws IOException {
            //创建数据源
            File startFile = new File("D:\\QQ");
            //创建目的地
            File endFile = new File("D:\\File");
    
            copy(startFile, endFile);
        }
    
        /*
         * 作用:拷贝文件夹
         * 参数一:数据源
         * 参数二:目的地
         * */
        private static void copy(File startFile, File endFile) throws IOException {
            //先创建目的地文件(当目的地文件存在时,则创建失败)
            endFile.mkdir();
            //进入文件夹
            File[] files = startFile.listFiles();
            //遍历数组
            for (File file : files) {
                //判断该file是文件还是文件夹
                if (file.isFile()) {//如果是文件,则拷贝(拷贝用字节流)
                    //创建字节输入流对象
                    FileInputStream fis = new FileInputStream(startFile);
                    //创建字节输出流对象
                    //new File(endFile, startFile.getName())指得是新创建个文件对象
                    //参数一:指要拷贝的目的地的文件
                    //参数二:指要拷贝目的地文件的名字
                    FileOutputStream fos = new FileOutputStream(new File(endFile, startFile.getName()));
                    //创建了个字节数组,加快拷贝效率
                    byte[] bytes = new byte[1024 * 1024 * 5];
                    int b;//定义一个变量记录每次读取的数据的个数
                    while ((b = fis.read()) != -1) {
                        fos.write(bytes, 0, b);
                    }
                    //释放资源(先开的流后关)
                    fos.close();
                    fis.close();
                } else {//如果是文件夹,则递归
                    copy(startFile, new File(endFile, startFile.getName()));
                }
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    1.3 输出结果

    在这里插入图片描述

    练习2:文件加密与解密

    2.1 需求

    为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。

    • 加密原理:
      对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
    • 解密原理:
      读取加密之后的文件,按照加密的规则反向操作,变成原始文件。

    ^ : 异或
    两边相同:false
    两边不同:true

           0:false
           1:true
    
           100:1100100
           10: 1010
    
     100与10异或:
            1100100
          ^    1010
          __________
            1101110
      110与10异或:
            1101110
          ^    1010
          __________
            1100100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.2 代码实现

    
    package text.IOStream.FileWrite.FileWrite03;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /*文件加密
    为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。
    加密原理:
        对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
    解密原理:
        读取加密之后的文件,按照加密的规则反向操作,变成原始文件。
    
         ^ : 异或
               两边相同:false
               两边不同:true
    
               0:false
               1:true
    
               100:1100100
               10: 1010
    
         100与10异或:
                1100100
              ^    1010
              __________
                1101110
          110与10异或:
                1101110
              ^    1010
              __________
                1100100
     */
    public class FileWrite03 {
        public static void main(String[] args) throws IOException {
            //创建对象并关联原始文件
            FileInputStream fis1 = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\a.txt");
            //创建对象并关联加密文件
            FileOutputStream fos1 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\b.txt");//创建对象并关联加密文件
            FileInputStream fis2 = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\b.txt");
            //创建对象并关联解密文件
            FileOutputStream fos2 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\c.txt");
    
            //加密
            ency(fis1, fos1);
    
            //解密
            redu(fis2, fos2);
        }
    
        //解密
        private static void redu(FileInputStream fis1, FileOutputStream fos2) throws IOException {
            int b;
            while ((b = fis1.read()) != -1) {
                fos2.write(b ^ 10);
            }
            //释放资源
            fos2.close();
            fis1.close();
        }
    
        //加密
        private static void ency(FileInputStream fis, FileOutputStream fos) throws IOException {
            int b;
            while ((b = fis.read()) != -1) {
                fos.write(b ^ 10);
            }
            //释放资源
            fos.close();
            fis.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    2.3 输出结果

    • 原来的文件:a.txt
      在这里插入图片描述
    • 加密后的文件:b.txt
      在这里插入图片描述
    • 解密后的文件:c.txt
      在这里插入图片描述

    练习3:修改文件数据(常规方法)

    3.1 需求

    需求:

    • 文本文件中有的数据:

      2-1-9-4-7-8

    • 将文件中的数据进行排序,变成以下的数据;

      1-2-4-7-8-9

    细节1:
       文件中的数据不要换行
    细节2:
       文件可能有隐藏的bom头
    
    • 1
    • 2
    • 3
    • 4

    3.2 代码实现

    package text.IOStream.FileWrite.FileWrite04;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    
    /*修改文件中的数据
    需求:
        文本文件中有的数据:
         2-1-9-4-7-8
         将文件中的数据进行排序,变成以下的数据;
         1-2-4-7-8-9
    
    细节1:
        文件中的数据不要换行
    细节2:
        文件可能有隐藏的bom头
     */
    public class FileWrite04 {
        public static void main(String[] args) throws IOException {
            //创建对象
            FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite04\\a.txt");
    
            //排序
            //创建StringBuilder对象用于存储数据
            StringBuilder sb = new StringBuilder();
            //创建变量记录读取的数据个数
            int b;
            while ((b = fr.read()) != -1) {
                sb.append((char) b);
            }
    
            fr.close();
    
            //将StringBuilder里的数据转换成字符串,方便截取
            String str = sb.toString();
            //截取字符串
            String[] split = str.split("-");
            //创建集合用于存储数字
            ArrayList<Integer> list = new ArrayList<>();
            //遍历数组,将数字存入集合
            for (String s : split) {
                int num = Integer.parseInt(s);
                list.add(num);
            }
            //排序集合里的数字
            Collections.sort(list);
    
            //写出
            FileWriter fw = new FileWriter("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite04\\a.txt");
            //遍历集合
            for (int i = 0; i < list.size(); i++) {
                if (i == list.size() - 1) {
                    fw.write(list.get(i) + "");//加""的原因是防止写入字符对应的数字
                } else {
                    fw.write(list.get(i) + "-");
                }
            }
    
            fw.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    3.3 输出结果

    • 原来文件数据
      在这里插入图片描述

    • 现在文件数据
      在这里插入图片描述

    练习4:修改文件数据(省略方法)

    4.1 需求

    需求:

    • 文本文件中有的数据:

      2-1-9-4-7-8

    • 将文件中的数据进行排序,变成以下的数据;

      1-2-4-7-8-9

    细节1:
       文件中的数据不要换行
    细节2:
       文件可能有隐藏的bom头
    
    • 1
    • 2
    • 3
    • 4

    4.2 代码实现

    package text.IOStream.FileWrite.FileWrite05;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.function.Function;
    
    /*修改文件中的数据
    需求:
    文本文件中有的数据:
    2-1-9-4-7-8
    将文件中的数据进行排序,变成以下的数据;
    1-2-4-7-8-9
    
    细节1:
        文件中的数据不要换行
    细节2:
        文件可能有隐藏的bom头
    */
    public class FileWrite05 {
        public static void main(String[] args) throws IOException {
            //创建对象
            FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite05\\a.txt");
            //创建StringBuilder对象用于存储数据
            StringBuilder sb = new StringBuilder();
            //创建变量记录读取的数据个数
            int b;
            while ((b = fr.read()) != -1) {
                sb.append((char) b);
            }
    
            fr.close();
    
            //排序
            Integer[] array = Arrays.stream(sb.toString().split("-"))//Stream流将StringBuilder里的数据转换成字符串并分割字符串
                    .map(new Function<String, Integer>() {
                        @Override
                        public Integer apply(String s) {
                            return Integer.parseInt(s);
                        }
                    })//格式转换
                    .sorted()//排序
                    .toArray(Integer[]::new);//利用方法引用转换成数组
    
            //写出
            FileWriter fw = new FileWriter("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite05\\a.txt");
    
            String replace = Arrays.toString(array).replace(", ", "-");//将排序后的数组中的 , 替换成 -
            String substring = replace.substring(1, replace.length() - 1); //截取字符串(截取第二个到倒数第二个)
            fw.write(substring);//写入数据
    
            fw.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    4.3 输出结果

    • 原来的文件数据
      在这里插入图片描述
    • 现在的文件数据
      在这里插入图片描述
  • 相关阅读:
    深度学习-nlp系列(2)文本分类(Bert)pytorch
    c语言 任意进制数的转换
    openharmony开源社区快速入门
    Python Parser 因子计算性能简单测试
    设计原则——依赖倒置原则
    HTTPS 加密工作过程
    【干货分享】.NET人脸识别解决方案
    JDK API
    爬虫Python
    Python量化投资——投资组合的评价和可视化(下):使用Matplotlib生成专业的投资回测数据可视化仪表盘【源码+详解】
  • 原文地址:https://blog.csdn.net/kuxiaoyang/article/details/136358418