字节流字符流相关列题

字节流字符流相关列题

1. 拷贝

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

注意在拷贝的时候是对应的文件拷贝文件,不是文件拷贝文件夹
FileOutputStream fos = new FileOutputStream(new File(end,file.getName()));

package IOStreamExercise;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

//拷贝文件夹(包括子文件)
public class Exercise1 {
    public static void main(String[] args) throws IOException {
        // 拷贝的数据源
        File start = new File("拷贝的文件");
        //拷贝的目的地
        File end = new File("拷贝到的位置");

        //创建拷贝方法
        CopyDir(start,end);
    }

    private static void CopyDir(File start, File end) throws IOException {
    	//若不存在当前文件夹,就创建该文件夹进行拷贝
        end.mkdirs();
        //1. 获取资源
        File[] files = start.listFiles();
        //2. 遍历,获取所有的元素
        for (File file : files) {
            if (file.isFile()){
                //3. 判断      文件     执行copy代码
                //获取到拷贝源
                FileInputStream fls = new FileInputStream(file);
                //获取到拷贝的文件
                //必须是文件对于拷贝的文件
                FileOutputStream fos = new FileOutputStream(new File(end,file.getName()));
                //创建一个数组接收数据
                byte[] bytes  = new byte[1024];
                //进行拷贝
                int len;
                while ((len = fls.read(bytes)) != -1){
                    fos.write(bytes,0,len);
                }
                //回收资源
                fos.close();
                fls.close();
            }else{
                //4. 判断      文件夹    递归
                CopyDir(file,new File(end,file.getName()));
            }
        }

    }


}

2. 文件加密

在这里插入图片描述
主要加密原理:
异或:^
true ^ false —> true
true ^ true ----> false

就是代表相同就返回true,不同就返回false

100 ^ 10 -->110
110 ^ 10 —> 100
原理图:
主要是通过二进制与十进制的转换达到的,加密条件
在这里插入图片描述

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Exercise2 {
    //加密文件为了保证文件的安全性,就需要对原始文件进行加密存储
    // 再使用的时候再对其进行解密处理。加密原理:
    //对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。解密原理:
    //读取加密之后的文件,按照加密的规则反向操作,变成原始文件。
    public static void main(String[] args) throws IOException {
        //创建需要加密的源文件
        FileInputStream fls = new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\photo.webp");
        //创建加密文件
        FileOutputStream fos = new FileOutputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.webp");
        //创建数组接收数据
        int len ;
        while ((len = fls.read()) != -1){
            fos.write(len^3);
        }
        //回收资源
        fos.close();
        fls.close();
    }
}

3. 修改文件当中的数据

在这里插入图片描述
法一:

import java.awt.geom.Area;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

/*文本文件中有以下的数据
        2-1-9-4-7-8
        将文件中的数据进行排序,变成以下的数据
        1-2-4-7-8-9*/
public class Exercise4 {
    public static void main(String[] args) throws IOException {
        //获取数据
        FileReader fr = new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
        StringBuilder sb = new StringBuilder();
        int len;
        while ((len = fr.read()) != -1){
            sb.append((char) len);
        }
        fr.close();
        //排序
        Integer[] array = Arrays.stream(sb.toString().split("-"))
                .map(Integer::parseInt)
                .sorted()
                .toArray(Integer[]::new);//当前表示的为排列好的整数数组

        //写入
        FileWriter fw = new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
        //改写其数据样式
        String s = Arrays.toString(array).replace(", ", "-");
        String result = s.substring(1, s.length() - 1);
        //写入数据
        fw.write(result);
        fw.close();
    }
}

法二:

import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

/*文本文件中有以下的数据
        2-1-9-4-7-8
        将文件中的数据进行排序,变成以下的数据
        1-2-4-7-8-9*/
public class Exercise3 {
    public static void main(String[] args) throws IOException {
        //获取到数据
        FileReader fr = new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
        //创建一个StringBuilder来接受数据,便于修改
        StringBuilder sb = new StringBuilder();
        int len;
        while ((len = fr.read()) != -1) {
            sb.append((char) len);
        }
        //回收资源
        fr.close();
        //排序
        //将sb转为字符串,利用split进行分割成数字
        String str = sb.toString();
        String[] arrays = str.split("-");
        ArrayList<Integer> list = new ArrayList<>();
        //将数据添加到集合当中进行排序
        for (String s : arrays) {
            int i = Integer.parseInt(s);
            list.add(i);
        }
        Collections.sort(list);//默认从小到大排序

        //写出
        FileWriter fw = new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\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();
    }
}

4. 修改文本当中的顺序

需求:把《出师表》的文章顺序进行恢复到一个新文件中

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

//需求:把《出师表》的文章顺序进行恢复到一个新文件中
public class Exercise5 {
    public static void main(String[] args) throws IOException {
        //创建字符流输入对象
        BufferedReader br = new BufferedReader(new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt"));

        //每次读取第一行
        ArrayList<String> list = new ArrayList<>();
        String len;
        while ((len = br.readLine()) != null){
            list.add(len);
        }
        br.close();
        //排序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //获取到o1,o2的首字母,进行排序
                int i1 = Integer.parseInt(o1.split("\\.")[0]);
                int i2 = Integer.parseInt(o2.split("\\.")[0]);
                return i1-i2;
            }
        });
        //写入数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt"));
        for (String s : list) {
            bw.write(s);
            bw.newLine();
        }
        //回收
        bw.close();
    }
}

5.利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码

思路:

  1. 字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定
  2. 字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定
package InputStreamReaders;

import java.io.*;
public class Exercise2 {
    public static void main(String[] args) throws IOException {
       /* //创建字节流
        FileInputStream fis = new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
        //每次读一整行,创建缓冲流,有因为字节流要使用,字符流的方法,就要创建转换流
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);*/

        //综合创建
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt")));
        String len;
        while ((len = br.readLine()) != null){
            System.out.println(len);
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值