【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 输出结果

  • 原来的文件数据
  • 现在的文件数据
相关推荐
P.H. Infinity20 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天24 分钟前
java的threadlocal为何内存泄漏
java
caridle35 分钟前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
萧鼎38 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸39 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农39 分钟前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^40 分钟前
数据库连接池的创建
java·开发语言·数据库
苹果醋344 分钟前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络