当前位置: 首页 > news >正文

【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:false1:true100:110010010: 1010100与10异或:1100100^    1010__________1101110110与10异或:1101110^    1010__________1100100

2.2 代码实现


package text.IOStream.FileWrite.FileWrite03;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*文件加密
为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。
加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件。^ : 异或两边相同:false两边不同:true0:false1:true100:110010010: 1010100与10异或:1100100^    1010__________1101110110与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>() {@Overridepublic 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 输出结果

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

相关文章:

  • 一些可以访问gpt的方式
  • 如何选择适合电商的WordPress主题模板?
  • 在Spring Boot中如何实现异常处理?
  • 长贵对赵本山说:你需要我们家大脚,我立马给你配双大鞋!
  • 为什么要用Python?
  • leetcode热题100学习计划-链表-相交链表
  • 【清理mysql数据库服务器二进制日志文件】
  • 如何在 Linux 中快速清空文件而不删除它们?
  • 恭喜莱佛士学生在SPADE室内设计大赛中一举拿下11个奖项
  • 鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
  • Azkaban 大数据 任务调度
  • 认识通讯协议——TCP/IP、UDP协议的区别,HTTP通讯协议的理解
  • 【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)
  • 750541-89-0,mPEG4 phosphonic acid,可以作为催化剂、络合剂
  • spring、springmvc、springboot框架的介绍
  • [NodeJS] 关于Buffer
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android Studio:GIT提交项目到远程仓库
  • Android交互
  • css系列之关于字体的事
  • CSS相对定位
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JS+CSS实现数字滚动
  • k8s如何管理Pod
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Linux下的乱码问题
  • php中curl和soap方式请求服务超时问题
  • React as a UI Runtime(五、列表)
  • Vue2 SSR 的优化之旅
  • 从0到1:PostCSS 插件开发最佳实践
  • 浏览器缓存机制分析
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 判断客户端类型,Android,iOS,PC
  • 区块链将重新定义世界
  • 什么是Javascript函数节流?
  • 实现菜单下拉伸展折叠效果demo
  • 思考 CSS 架构
  • 微信公众号开发小记——5.python微信红包
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我建了一个叫Hello World的项目
  • 移动端 h5开发相关内容总结(三)
  • Spring Batch JSON 支持
  • 阿里云ACE认证学习知识点梳理
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 数据可视化之下发图实践
  • (9)STL算法之逆转旋转
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (黑马C++)L06 重载与继承
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (全注解开发)学习Spring-MVC的第三天
  • (十三)Flask之特殊装饰器详解