IO流综合练习

练习一:

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

package IO流;

import java.io.*;

public class 练习1 {
    public static void main(String[] args) throws IOException {
        File src = new File("D:\\aaa\\src");
        File dest = new File("D:\\aaa\\dest");
        copydir(src,dest);
    }


    /*
    作用:拷贝文件夹 方法一数据源,方法二目的地
     */
    private static void copydir(File src, File dest) throws IOException {
        dest.mkdirs();//不存在就创建,存在则不创建   
        //递归
        //进入数据源 -> 遍历数组 ->判断是文件拷贝?判断是文件夹递归。
        File[] files =  src.listFiles();
        for (File file : files) {
            //文件开始->文件结束
            if (file.isFile()){
                //判断文件,拷贝
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));
                byte[] bytes = new byte[1024];
                int len;
                while ((len = fis.read(bytes))!=-1){
                    fos.write(bytes,0,len);
                }
                fos.close();
                fis.close();
            }else{
                //判断文件夹递归
                copydir(file,new File(dest,file.getName()));
            }
        }
    }
}

这个是需要用到递归操作的,因为打开一个文件夹里面可能还会包含多个文件或者文件夹,需要不断的递归进行判断是不是文件夹然后再进行操作,如果是文件则拷贝,如果是文件夹则递归。

关于:FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));解释
  • 这段代码的作用是创建一个`FileOutputStream`对象,用于将数据写入目的文件夹中的文件。

    首先,`new File(dest, file.getName())`会创建一个目标文件对象,该文件对象的路径是目的文件夹路径(dest)加上源文件(file)的文件名(file.getName())。

    然后,`new FileOutputStream()`会创建一个文件输出流对象,该输出流会将数据写入目标文件中。这里使用的是文件输出流的构造方法,它需要传入一个`File`对象来指定要写入的文件。

    最后,将创建的文件输出流对象赋值给`FileOutputStream fos`,以便后续使用。

    总的来说,这段代码的作用是将数据写入目的文件夹中的特定文件中。

  • 如果直接使用`dest`作为参数传递给`FileOutputStream`的构造方法,将会创建一个文件输出流对象,用于将数据写入目标文件夹本身(而不是目标文件夹中的具体文件)。

    这样的操作是不符合常规需求的,因为目标文件夹本身并不是一个文件,而是一个文件夹。文件输出流用于写入文件而不是文件夹。因此,如果直接使用`dest`作为参数,会抛出一个`FileNotFoundException`异常。

    所以,在这段代码中,`new File(dest, file.getName())`的作用是创建一个指定目标文件夹中的具体文件路径,以便将数据写入该文件中,而不是写入目标文件夹本身。

关于这段代码解释:copydir(file,new File(dest,file.getName()));

  • 参数一是数据源,file就是遍历到判断是文件夹
  • 参数二是目的地,new File(dest,file.getName()));
  • 是在父级dest的路径拷贝一个在file文件下遍历到的file文件的名字,方法开头添加了dest.mkdirs();如果dest不存这个file文件的名字就还创建,存在则不创建, 

 

此时file文件里面是没有新建文件夹的

当程序执行完毕之后

 会在dest文件夹里面创建一个跟src文件夹下面的一模一样名字,这就是file.getName()作用。


 练习二:文件加密

public class Test02 {
    public static void main(String[] args) throws IOException {
        /*
            为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。
            加密原理:
                对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
            解密原理:
                读取加密之后的文件,按照加密的规则反向操作,变成原始文件。

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

                 0:false
                 1:true

               100:1100100
               10: 1010

               1100100
             ^ 0001010
             __________
               1101110
             ^ 0001010
             __________
               1100100

        */
    }

    public static void encryptionAndReduction(File src, File dest) throws IOException {
        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(dest);
        int b;
        while ((b = fis.read()) != -1) {
            fos.write(b ^ 2);
        }
        //4.释放资源
        fos.close();
        fis.close();
    }
}

 


练习三:数字排序

文本文件中有的数据: 2-1-9-4-7-8 将文件中的数据进行排序,变成: 1-2-4-7-8-9

方法1:

package IO流;

import java.awt.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class 练习2 {
    public static void main(String[] args) throws IOException {
        // 创建文件读取器对象 FileReader
        FileReader fr = new FileReader("D:\\aaa\\a.txt");

        // 创建 StringBuilder 对象,用于存储读取到的字符
        StringBuilder sb = new StringBuilder();

        int ch;
        // 读取文件内容,将字符追加到 StringBuilder 中
        while ((ch = fr.read()) != -1) {
            sb.append((char) ch);
        }

        fr.close(); // 关闭文件读取器

        String str = sb.toString(); // 将 StringBuilder 转换为 String
        String[] arr = str.split("-"); // 按照 "-" 分割字符串为字符串数组

        // 创建 ArrayList 对象,用于存储拆分后的整数
        ArrayList<Integer> list = new ArrayList<>();
        for (String s : arr) {
            int i = Integer.parseInt(s); // 将字符串转换为整数
            list.add(i); // 将整数添加到 ArrayList 中
        }

        Collections.sort(list); // 对 ArrayList 进行排序

        // 创建文件写入器对象 FileWriter
        FileWriter fw = new FileWriter("D:\\aaa\\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(); // 关闭文件写入器

        System.out.println(list); // 打印排序后的整数列表
    }
}

方法二:

第二种方法用到的基础比较强一点,用到了方法引用,stream流

package IO流;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

public class 练习21 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("D:\\aaa\\a.txt");
        StringBuilder sb = new StringBuilder();
        int ch;
        while ((ch = fr.read()) != -1) {
            sb.append((char) ch);
        }
        fr.close();

        // 将读取的字符串按照"-"进行分割,并将分割后的字符串转换为Integer数组
        Integer[] arr = Arrays.stream(sb.toString()
                        .split("-"))
                .map(Integer::parseInt)
                .sorted() // 对数组进行排序
                .toArray(Integer[]::new);

        // 创建FileWriter对象来写入文件
        FileWriter fw = new FileWriter("D:\\aaa\\a.txt");
        // 将排序后的数组转换为字符串,去除首尾的方括号和逗号,并将分割符"-"替换回来
        fw.write(Arrays.toString(arr).substring(1,Arrays.toString(arr).length()-1).replace(",","-"));
        // 关闭FileWriter
        fw.close();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值