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

字符流练习

    • 练习1:文件夹拷贝
      • 1.1 需求
      • 1.2 代码实现
      • 1.3 输出结果
    • 练习2:文件加密与解密
      • 2.1 需求
      • 2.2 代码实现
      • 2.3 输出结果
    • 练习3:修改文件数据(常规方法)
      • 3.1 需求
      • 3.2 代码实现
      • 3.3 输出结果
    • 练习4:修改文件数据(省略方法)
      • 4.1 需求
      • 4.2 代码实现
      • 4.3 输出结果

练习1:文件夹拷贝

1.1 需求

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

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

1.2 代码实现

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 代码实现


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 代码实现

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 代码实现

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

  • 原来的文件数据
    在这里插入图片描述
  • 现在的文件数据
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最小高度树-力扣(Leetcode)

题目链接 最小高度树 思路&#xff1a;本质上是找到树中的最长路径。当最长路径上中间点&#xff08;若路经长为偶数&#xff0c;则中间点仅有一个&#xff0c;否者中间点有两个&#xff09;作为根时&#xff0c;此时树高最小。 Code: class Solution { public://拓扑排序int…

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商&#xff0c;武汉灰京文化注重多样化的推广策略&#xff0c;通过与各大媒体、社交平台和游戏社区建立紧密的合作关系&#xff0c;为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式&#xff0c;将游戏信息传播给…

Unity曲柄滑块四杆机构运动计算

一、运动效果 二、机构的介绍 曲柄长度&#xff1a;a&#xff0c;线段AB长度 连杆长度&#xff1a;b&#xff0c;线段BC长度 偏心距离&#xff1a;e&#xff0c;滑块轨迹与曲柄中心点A的垂直距离 三、已知点A点B和e的值&#xff0c;计算C点的位置 1、计算s的值 var h math.…

阻塞队列介绍

阻塞队列 kafka是目前来说性能最好的消息队列服务器&#xff0c;能处理TB级别的数据 作用:点赞、评论时&#xff0c;服务器会自动给某个用户发送通知 kafka是个框架&#xff0c;如果不用框架还要解决类似问题&#xff0c;就要用到阻塞队列 BlockingQueue 阻塞队列就是一个…

【C++】vector 的常用接口

目录 一、vector是什么❓ 二、vector的使用 1、构造函数 2、修改数据 ⭕️size ⭕️capacity ⭕️empty ⭕️clear ⭕️resize&#xff08;重要&#xff09; ⭕️reserve&#xff08;重要&#xff09; ​3、遍历数据 ⭕️operator[ ] &#xff08;重要&#xff09; …

35 Spring整合Elasticsearch

文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据&#xff08;es核心&#xff09;步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsear…

wps没保存关闭了怎么恢复数据?恢复文件教程

Microsoft Word是我们不可或缺的工具。很多小伙伴都遇到在WPS中编辑文件时&#xff0c;它可能会突然闪退&#xff0c;或者忘记及时保存文件就直接关闭了&#xff0c;导致我们辛苦编辑的文档丢失。面对这种情况我们该如何应对&#xff0c;尽量减小损失呢&#xff1f;接下来让我为…

is_sorted()函数的练习

仅是用来巩固训练verctor容器与is_sorted()、next_permutation()函数 #include <bits/stdc.h> using namespace std;bool cmp1(int a,int b){if(a>b)return true;return false; } bool cmp2(int a,int b){if(a<b)return true;return false; } int main(){vector<…

博客笔记项目的自动化测试

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;测试开发项目 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录 …

Mongodb基础(node.js版)

一、Mongodb 介绍 Mongodb 是一个文档数据库&#xff0c;以文档形式存储数据&#xff0c;格式类似于 JSON 与 Mysql 的特点及选型对照 MongodbMysql关系类型非关系型关系型存储类型文档存储&#xff08;类似于写 Word &#xff09;表格存储 &#xff08;类似于写 Excle&…

浙江大学主办!2024年第7届信息通信与信号处理国际会议( ICICSP2024)征稿开启!

会议官网 IEEE | ICICSP 2024 学术会议查询-学术会议交流服务平台-爱科会易 (uconf.com)​www.uconf.com/

Day12:信息打点-Web应用源码泄漏开源闭源指纹识别GITSVNDS备份

目录 开源-CMS指纹识别源码获取方式 闭源-习惯&配置&特性等获取方式 闭源-托管资产平台资源搜索监控 思维导图 章节点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接口/微…

17.来自Sora的夺舍妄想——享元模式详解

OpenAI 的 Sora 模型面世之后&#xff0c;可以说人类抵御AI的最后阵地也沦陷了。 在此之前&#xff0c;人们面对AI交互式对话&#xff0c;AI制图&#xff0c;AI建模之类的奇迹时&#xff0c;还可以略微放肆的说&#xff1a;“的确很神奇&#xff0c;这毕竟还是比人类世界低了一…

【go从入门到精通】go包,内置类型和初始化顺序

大家好&#xff0c;这是我给大家准备的新的一期专栏&#xff0c;专门讲golang&#xff0c;从入门到精通各种框架和中间件&#xff0c;工具类库&#xff0c;希望对go有兴趣的同学可以订阅此专栏。 go基础 。 Go文件名&#xff1a; 所有的go源码都是以 ".go" 结尾&…

pytorch -- torch.nn网络结构

1. 官网描述 官网 使用 torch.nn 模块&#xff0c;我们可以创建自定义的神经网络模型&#xff0c;并使用 PyTorch 提供的优化器&#xff08;如 torch.optim&#xff09;和损失函数来训练和优化模型。 2. 常见结构 1.卷积操作 定义&#xff1a; 二维卷积 1.1版本 nn.functio…

香港大学发布思维扩散DoT,让思维在时间上扩散,提效保质!

引言&#xff1a;探索结合扩散模型与思维链来提升大模型推理能力 在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经引起了广泛的关注&#xff0c;它们在自然语言处理和机器学习的经典问题上展现出了显著的推理能力。特别是&#xff0c;思维链&#xff0…

Vue开发实例(九)动态路由实现左侧菜单导航

之前在【Vue开发实例&#xff08;六&#xff09;实现左侧菜单导航】文中实现了菜单的导航&#xff0c;本篇是在那个基础上改造的。 动态路由实现左侧菜单导航 一、动态菜单创建二、根据菜单数据来创建路由三、添加路由已加载标记&#xff0c;省的每次点击菜单都要加载 一、动态…

开源项目:图像分类算法在保险行业的创新应用与实践

一、引言 在当今数字化时代&#xff0c;保险行业正经历着前所未有的变革。传统保险公司面临着新兴科技的挑战&#xff0c;被迫重新思考其业务模式和营销策略。在这种背景下&#xff0c;我有幸参与了一个项目&#xff0c;该项目旨在通过整合多种销售渠道和技术手段&#xff0c;提…

【蓝桥杯】错误票据

今天是2024年3月1号&#xff0c;蓝桥杯比赛还有一个月的时间&#xff0c;虽说自己不指望拿奖吧&#xff0c;但是还是有些莫i名的焦虑&#xff0c;这道题目都做不出来&#xff0c;感觉自己真的有点菜啊&#xff01;但是还好啦&#xff0c;我觉得是因为我没有题感&#xff0c;慢慢…

DDS数据分发服务——提升汽车领域数据传输效率

1.引言 随着智能化技术的快速发展&#xff0c;汽车行业正经历着一场革命性的变革。如今的分布式系统变得越来越复杂且庞大&#xff0c;对网络通信基数要求在功能和性能层面越来越高。数据分发服务&#xff08;DDS&#xff09;作为一项先进的数据传输解决方案&#xff0c;在汽车…