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

news2024/11/16 22:31:29

字符流练习

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sqli-labs靶场第19关详解[Sqli-labs-less-19]自动化注入-SQLmap工具注入

Sqli-labs-Less-19 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了Referer &#xff0c;设想如果在Referer 尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

javaEE--后端环境变量配置

目录 pre 文件准备 最终运行成功结果 后端运行步骤 1.修改setenv文件 2.运行setenv&#xff0c;设置环境变量 3.查看jdk版本 4.修改mysql文件夹下的my文件 前端运行步骤 1.nodejs环境配置 2.查看node和npm版本 3.下载并运行npm 4.注册登录 pre 文件准备 最终运行…

c++基础学习第一天

c基础学习第一天 文章目录 1、C初识1.1、注释1.2、变量1.3、常量1.4、关键字1.5、标识符命名规则 2、数据类型2.1、整型2.2、sizeof关键字2.3、实型&#xff08;浮点型&#xff09;2.4、字符型2.5、转义字符2.6、字符串型2.7、布尔类型bool2.8、数据的输入 3、运算符3.1、算术运…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

低密度奇偶校验码LDPC(八)——QC-LDPC译码器FPGA设计概要

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

循序渐进丨MogDB / openGauss 的三种函数稳定性关键字

一、Oracle 中类似的函数稳定性关键字&#xff08;DETERMINISTIC&#xff09; 在 Oracle 里&#xff0c;function有着一个DETERMINISTIC参数&#xff0c;它表示一个函数在输入不变的情况下输出是否确定&#xff0c;只要输入的参数一样&#xff0c;返回的结果一定是一样的&#…

挑选适合您企业的2024年人力资源管理软件:完整指南

今日给您盘点的热门人力资源管理软件有&#xff1a;Zoho People&#xff0c;SAP ERP HCM&#xff0c;Workday&#xff0c;Oracle HCM Cloud。 Zoho People 人力资源管理系统 Zoho People是一款由Zoho公司开发的人力资源管理软件&#xff0c;旨在从集中位置管理和访问所有员工数…

Sqli-labs靶场第20关详解[Sqli-labs-less-20]自动化注入-SQLmap工具注入

Sqli-labs-Less-20 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 登录后会有记录 Cookie 值 设想如果在Cookie尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

STM32标准库开发——WDG看门狗

WDG&#xff08;Watchdo&#xff09;看门狗介绍 独立看门狗&#xff0c;独立运行&#xff0c;有自己的专门时钟——内部低速时钟LSI&#xff0c;只要在最晚喂狗时间前喂狗就不会导致自动复位 窗口看门狗&#xff0c;用的是APB1的时钟&#xff0c;不是独立的时钟。喂狗时间比较严…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾&#xff0c;竖屏拼接 4.3.1系统…

【网站项目】123网上书城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

前端学习第四天-css提升

达标要求 掌握css复合选择器 块级元素和行内元素及行内块的区别? 哪些元素是块元素,行内元素及行内块元素? 熟练掌握display的用法 能够说出css三大特性 熟练运用背景样式 1. CSS复合选择器 复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的…

Matlab偏微分方程拟合 | 源码分享 | 视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

【QT+QGIS跨平台编译】之六十四:【QGIS_CORE跨平台编译】—【错误处理:未定义类型QTemporaryDir - QgsSourceCache】

文章目录 一、未定义类型QTemporaryDir二、解决办法 一、未定义类型QTemporaryDir 报错&#xff1a; 二、解决办法 QgsSourceCache.h文件中 第25行修改为&#xff1a; #include <QTemporaryDir>

【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

数据结构 第3章 栈、队列和数组(一轮习题总结)

第3章 栈、队列和数组 3.1 栈3.2 队列3.3 栈与队列的应用3.4 数组和特殊矩阵 3.1 栈&#xff08;1 10 11 20&#xff09; 3.2 队列&#xff08;6 12 14 17&#xff09; 3.3 栈与队列的应用&#xff08;6 11&#xff09; 3.4 数组和特殊矩阵 3.1 栈 T1 栈和队列具有相同的逻辑…

tcpdump使用pcap-filter抓Vxlan包内数据

目录 1. 背景2. 参考3. 概念4. 环境5. 用法5.1 抓vxlan通讯中的icmp包5.2 tcpdump抓包命令解析5.2.1 tcpdump命令说明5.2.2 Vxlan协议报文解析 5.3 其他抓包例子5.3.1 抓包示例15.3.2 抓包示例2 1. 背景 看vxlan协议时&#xff0c;发现可以使用tcpdump高级用法&#xff08;pca…

微信小程序云开发教程——墨刀原型工具入门(Axure导入)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

el-table实现转置表格

vue版本&#xff1a;vue2.6.10 elementui版本&#xff1a;2.15.14 实现效果&#xff1a;el-table实现行列互换 代码&#xff1a; <template><div class"app-container"><span>原始数据</span><el-table:data"datas"border>…

springer模板参考文献不显示

Spring期刊模板网站&#xff0c;我的问题是23年12月的版本 https://www.springernature.com/gp/authors/campaigns/latex-author-support/see-where-our-services-will-take-you/18782940 参考文献显示问好&#xff0c;在sn-article.tex文件中&#xff0c;这个sn-mathphys-num…