字符流练习
- 练习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 输出结果
- 原来的文件数据
- 现在的文件数据