字节流字符流相关列题
1. 拷贝
需求:
拷贝一个文件夹,考虑子文件夹
注意在拷贝的时候是对应的文件拷贝文件,不是文件拷贝文件夹
FileOutputStream fos = new FileOutputStream(new File(end,file.getName()));
package IOStreamExercise;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//拷贝文件夹(包括子文件)
public class Exercise1 {
public static void main(String[] args) throws IOException {
// 拷贝的数据源
File start = new File("拷贝的文件");
//拷贝的目的地
File end = new File("拷贝到的位置");
//创建拷贝方法
CopyDir(start,end);
}
private static void CopyDir(File start, File end) throws IOException {
//若不存在当前文件夹,就创建该文件夹进行拷贝
end.mkdirs();
//1. 获取资源
File[] files = start.listFiles();
//2. 遍历,获取所有的元素
for (File file : files) {
if (file.isFile()){
//3. 判断 文件 执行copy代码
//获取到拷贝源
FileInputStream fls = new FileInputStream(file);
//获取到拷贝的文件
//必须是文件对于拷贝的文件
FileOutputStream fos = new FileOutputStream(new File(end,file.getName()));
//创建一个数组接收数据
byte[] bytes = new byte[1024];
//进行拷贝
int len;
while ((len = fls.read(bytes)) != -1){
fos.write(bytes,0,len);
}
//回收资源
fos.close();
fls.close();
}else{
//4. 判断 文件夹 递归
CopyDir(file,new File(end,file.getName()));
}
}
}
}
2. 文件加密
主要加密原理:
异或:^
true ^ false
—> true
true ^ true
----> false
就是代表相同就返回
true
,不同就返回false
100 ^ 10
-->110
110 ^ 10
—> 100
原理图:
主要是通过二进制与十进制的转换达到的,加密条件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Exercise2 {
//加密文件为了保证文件的安全性,就需要对原始文件进行加密存储
// 再使用的时候再对其进行解密处理。加密原理:
//对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。解密原理:
//读取加密之后的文件,按照加密的规则反向操作,变成原始文件。
public static void main(String[] args) throws IOException {
//创建需要加密的源文件
FileInputStream fls = new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\photo.webp");
//创建加密文件
FileOutputStream fos = new FileOutputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.webp");
//创建数组接收数据
int len ;
while ((len = fls.read()) != -1){
fos.write(len^3);
}
//回收资源
fos.close();
fls.close();
}
}
3. 修改文件当中的数据
法一:
import java.awt.geom.Area;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
/*文本文件中有以下的数据
2-1-9-4-7-8
将文件中的数据进行排序,变成以下的数据
1-2-4-7-8-9*/
public class Exercise4 {
public static void main(String[] args) throws IOException {
//获取数据
FileReader fr = new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
StringBuilder sb = new StringBuilder();
int len;
while ((len = fr.read()) != -1){
sb.append((char) len);
}
fr.close();
//排序
Integer[] array = Arrays.stream(sb.toString().split("-"))
.map(Integer::parseInt)
.sorted()
.toArray(Integer[]::new);//当前表示的为排列好的整数数组
//写入
FileWriter fw = new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
//改写其数据样式
String s = Arrays.toString(array).replace(", ", "-");
String result = s.substring(1, s.length() - 1);
//写入数据
fw.write(result);
fw.close();
}
}
法二:
import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
/*文本文件中有以下的数据
2-1-9-4-7-8
将文件中的数据进行排序,变成以下的数据
1-2-4-7-8-9*/
public class Exercise3 {
public static void main(String[] args) throws IOException {
//获取到数据
FileReader fr = new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
//创建一个StringBuilder来接受数据,便于修改
StringBuilder sb = new StringBuilder();
int len;
while ((len = fr.read()) != -1) {
sb.append((char) len);
}
//回收资源
fr.close();
//排序
//将sb转为字符串,利用split进行分割成数字
String str = sb.toString();
String[] arrays = str.split("-");
ArrayList<Integer> list = new ArrayList<>();
//将数据添加到集合当中进行排序
for (String s : arrays) {
int i = Integer.parseInt(s);
list.add(i);
}
Collections.sort(list);//默认从小到大排序
//写出
FileWriter fw = new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\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();
}
}
4. 修改文本当中的顺序
需求:把《出师表》的文章顺序进行恢复到一个新文件中
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
//需求:把《出师表》的文章顺序进行恢复到一个新文件中
public class Exercise5 {
public static void main(String[] args) throws IOException {
//创建字符流输入对象
BufferedReader br = new BufferedReader(new FileReader("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt"));
//每次读取第一行
ArrayList<String> list = new ArrayList<>();
String len;
while ((len = br.readLine()) != null){
list.add(len);
}
br.close();
//排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//获取到o1,o2的首字母,进行排序
int i1 = Integer.parseInt(o1.split("\\.")[0]);
int i2 = Integer.parseInt(o2.split("\\.")[0]);
return i1-i2;
}
});
//写入数据
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt"));
for (String s : list) {
bw.write(s);
bw.newLine();
}
//回收
bw.close();
}
}
5.利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码
思路:
- 字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定
- 字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定
package InputStreamReaders;
import java.io.*;
public class Exercise2 {
public static void main(String[] args) throws IOException {
/* //创建字节流
FileInputStream fis = new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt");
//每次读一整行,创建缓冲流,有因为字节流要使用,字符流的方法,就要创建转换流
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);*/
//综合创建
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\Java文件夹\\words\\IOExrecise\\src\\sad\\a.txt")));
String len;
while ((len = br.readLine()) != null){
System.out.println(len);
}
}
}