行业知识
【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)
2026-11-03 13:51:26
来源:互联网转载
字符流练习
- 练习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 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; i3.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() { @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 输出结果
- 原来的文件数据
- 现在的文件数据
- 文本文件中有的数据:
-
- 文本文件中有的数据:
- 加密原理: