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

字符流练习

练习1:文件夹拷贝

1.1 需求

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

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

1.2 代码实现

java 复制代码
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.3 输出结果

练习2:文件加密与解密

2.1 需求

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

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

^ : 异或

两边相同:false

两边不同:true

复制代码
       0:false
       1:true

       100:1100100
       10: 1010

 100与10异或:
        1100100
      ^    1010
      __________
        1101110
  110与10异或:
        1101110
      ^    1010
      __________
        1100100

2.2 代码实现

java 复制代码
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();
    }
}

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头

3.2 代码实现

java 复制代码
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();
    }
}

3.3 输出结果

  • 原来文件数据

  • 现在文件数据

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

4.1 需求

需求:

  • 文本文件中有的数据: 2-1-9-4-7-8

  • 将文件中的数据进行排序,变成以下的数据; 1-2-4-7-8-9

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

4.2 代码实现

java 复制代码
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();
    }
}

4.3 输出结果

  • 原来的文件数据
  • 现在的文件数据
相关推荐
fei_sun1 分钟前
【Harmony OS】作业四 布局
java·linux·网络
martian66513 分钟前
在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发
开发语言·人工智能·开源·dicom
weixin_4293260915 分钟前
Spring MVC-面试题(33)
java·spring·mvc
为美好的生活献上中指19 分钟前
java每日精进 5.20【MyBatis 联表&分页查询】
java·tomcat·mybatis·mpj
Once_day42 分钟前
C++之fmt库介绍和使用(2)
开发语言·c++·fmt
冰^1 小时前
HTTP 与 HTTPS 深度解析:原理、实践与大型项目应用
java·spring boot·网络协议·spring·http·https·maven
Liu.7741 小时前
vue2组件对象传参
开发语言·前端·javascript
在未来等你1 小时前
互联网大厂Java求职面试:Spring Boot 3.2+自动配置原理、AOT编译及原生镜像
java·spring boot·graalvm·aot·虚拟线程
举一个梨子zz1 小时前
Java—— 网络爬虫
java·开发语言·爬虫·intellij-idea·需求分析
良枫1 小时前
RocketMQ消息拉取模式详解
java·rocketmq