Java基础----字节流和字符流

发布于:2024-04-21 ⋅ 阅读:(25) ⋅ 点赞:(0)

1.使用字节流拷贝文件夹

import java.io.*;

public class Tset01 {
    public static void main(String[] args) throws IOException {
        //拷贝一个文件夹,考虑子文件夹
        //E:\hello -> E:\aaa
        File src=new File("E:\\hello");
        File dest=new File("E:\\dest");
        copydir(src,dest);
    }
    private static void copydir(File src, File dest) throws IOException {
        dest.mkdir();
        //递归---如果是文件,直接拷贝,如果是文件夹,进行递归
        //1.进入数据源
        File[] files=src.listFiles();
        //2.遍历数据
        for (File file : files) {
            if (file.isFile()){
                //3.判断是文件,直接拷贝
                FileInputStream fis = new FileInputStream(file);
                //写入到文件夹时,必须以文件开始,文件结束----即要在out文件夹中创建相对应的文件,其中dest是父目录
                FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));
                byte[] bytes=new byte[1024*1024];
                int len;
                while ((len=fis.read(bytes)) != -1){
                    fos.write(bytes,0,len);
                }
                fos.close();
                fis.close();
            }else {
                //4.判断是文件夹,递归
                copydir(file,new File(dest,file.getName()));
            }
        }
    }
}

        1.在拷贝文件夹的时候,我们需要注意:必须在新文件夹中有与原文件夹中的所有文件一一对应。记住--以文件开始,以文件结束。

         2.如果要拷贝的文件夹中都是文件,我们直接写入即可,由于不知道文件大小,所以采用数组存储一次读取多少字节。一般都是1024的整数倍

        3.文件夹中有文件夹的话,我们需要递归调用此函数,再进行写入。

2.对原始文件进行加密存储,再使用的时候再对其进行解密处理

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

在解密,解密文件的时候,我选择采用异或的方式。

//先加密
        //1.创建对象去关联原始文件
        FileInputStream fis = new FileInputStream("E:\\JetBrains2023\\JavaSE\\1.jpg");
        //2.创建对象去关联加密文件
        FileOutputStream fos = new FileOutputStream("E:\\JetBrains2023\\JavaSE\\ency.jpg");
        //3.加密处理
        int n;
        while ((n=fis.read()) != -1){
            fos.write(n ^ 10);
        }
        //4.释放资源
        fos.close();
        fis.close();

        //后解密
        //1.创建对象去关联原始文件
        FileInputStream fis1 = new FileInputStream("E:\\JetBrains2023\\JavaSE\\ency.jpg");
        //2.创建对象去关联加密文件
        FileOutputStream fos1 = new FileOutputStream("E:\\JetBrains2023\\JavaSE\\redu.jpg");
        //3.加密处理
        int b;
        while ((b=fis1.read()) != -1){
            fos1.write(b ^ 10);
        }
        //4.释放资源
        fos.close();
        fis.close();

大家去了解异或的相关知识后可以得知----两次异或同一个数,还是原数本身。

至于为什么fis.read()后的结果可以和整数10异或,那是因为idea会把结果和10进行二进制转化。

3.文件中的数据进行排序

例如: 2-1-9-4-7-8-》1-2-4-7-8-9

//1.读取数据
        FileReader fr = new FileReader("E:\\JetBrains2023\\JavaSE\\a.txt");
        StringBuilder stringBuilder=new StringBuilder();

        //2.排序
        int ch;
        while ((ch=fr.read())!=-1){
            stringBuilder.append((char) ch);
        }
        fr.close();
        String str = stringBuilder.toString();
        ArrayList<Integer> list = new ArrayList<>();
        String[] split = str.split("-");

        for (String s : split) {
            int i = Integer.parseInt(s);
            list.add(i);
        }
        Collections.sort(list);
        //3.写出数据
        FileWriter fw = new FileWriter("E:\\JetBrains2023\\JavaSE\\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();

        StringBuilder stringBuilder=new StringBuilder()是为了可以操作字符串,要不然我们只能看不能动手。

这些代码相对来说比较繁琐,我们可以采用stream()流的方式改进

//1.读取数据
        FileReader fr = new FileReader("E:\\JetBrains2023\\JavaSE\\a.txt");
        StringBuilder stringBuilder=new StringBuilder();
        int ch;
        while ((ch=fr.read())!=-1){
            stringBuilder.append((char) ch);
        }
        fr.close();
        //2.排序
        Integer[] arr=Arrays.stream(stringBuilder.toString()
                .split("-"))
                .map(Integer::parseInt)
                .sorted()
                .toArray(Integer[]::new);
        //3.写出数据
        FileWriter fw = new FileWriter("E:\\JetBrains2023\\JavaSE\\a.txt");
        String s=Arrays.toString(arr).replace(",","-");
        String result = s.substring(1, s.length() - 1);
        fw.write(result);
        fw.close();

其中map()方法是进行数据类型转换。

toArray()是将结果收集到数组中。