1.使用字节流拷贝文件夹
import java.io.*;
public class Tset01 {
public static void main(String[] args) throws IOException {
//拷贝一个文件夹,考虑子文件夹
//E:\hello -> E:\aaa
File src=new File("E:\\hello");
File dest=new File("E:\\dest");
copydir(src,dest);
}
private static void copydir(File src, File dest) throws IOException {
dest.mkdir();
//递归---如果是文件,直接拷贝,如果是文件夹,进行递归
//1.进入数据源
File[] files=src.listFiles();
//2.遍历数据
for (File file : files) {
if (file.isFile()){
//3.判断是文件,直接拷贝
FileInputStream fis = new FileInputStream(file);
//写入到文件夹时,必须以文件开始,文件结束----即要在out文件夹中创建相对应的文件,其中dest是父目录
FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));
byte[] bytes=new byte[1024*1024];
int len;
while ((len=fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}else {
//4.判断是文件夹,递归
copydir(file,new File(dest,file.getName()));
}
}
}
}
1.在拷贝文件夹的时候,我们需要注意:必须在新文件夹中有与原文件夹中的所有文件一一对应。记住--以文件开始,以文件结束。
2.如果要拷贝的文件夹中都是文件,我们直接写入即可,由于不知道文件大小,所以采用数组存储一次读取多少字节。一般都是1024的整数倍
3.文件夹中有文件夹的话,我们需要递归调用此函数,再进行写入。
2.对原始文件进行加密存储,再使用的时候再对其进行解密处理
加密原理:
对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。
解密原理:
读取加密之后的文件,按照加密的规则反向操作,变成原始文件。
在解密,解密文件的时候,我选择采用异或的方式。
//先加密
//1.创建对象去关联原始文件
FileInputStream fis = new FileInputStream("E:\\JetBrains2023\\JavaSE\\1.jpg");
//2.创建对象去关联加密文件
FileOutputStream fos = new FileOutputStream("E:\\JetBrains2023\\JavaSE\\ency.jpg");
//3.加密处理
int n;
while ((n=fis.read()) != -1){
fos.write(n ^ 10);
}
//4.释放资源
fos.close();
fis.close();
//后解密
//1.创建对象去关联原始文件
FileInputStream fis1 = new FileInputStream("E:\\JetBrains2023\\JavaSE\\ency.jpg");
//2.创建对象去关联加密文件
FileOutputStream fos1 = new FileOutputStream("E:\\JetBrains2023\\JavaSE\\redu.jpg");
//3.加密处理
int b;
while ((b=fis1.read()) != -1){
fos1.write(b ^ 10);
}
//4.释放资源
fos.close();
fis.close();
大家去了解异或的相关知识后可以得知----两次异或同一个数,还是原数本身。
至于为什么fis.read()后的结果可以和整数10异或,那是因为idea会把结果和10进行二进制转化。
3.文件中的数据进行排序
例如: 2-1-9-4-7-8-》1-2-4-7-8-9
//1.读取数据
FileReader fr = new FileReader("E:\\JetBrains2023\\JavaSE\\a.txt");
StringBuilder stringBuilder=new StringBuilder();
//2.排序
int ch;
while ((ch=fr.read())!=-1){
stringBuilder.append((char) ch);
}
fr.close();
String str = stringBuilder.toString();
ArrayList<Integer> list = new ArrayList<>();
String[] split = str.split("-");
for (String s : split) {
int i = Integer.parseInt(s);
list.add(i);
}
Collections.sort(list);
//3.写出数据
FileWriter fw = new FileWriter("E:\\JetBrains2023\\JavaSE\\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();
StringBuilder stringBuilder=new StringBuilder()是为了可以操作字符串,要不然我们只能看不能动手。
这些代码相对来说比较繁琐,我们可以采用stream()流的方式改进。
//1.读取数据
FileReader fr = new FileReader("E:\\JetBrains2023\\JavaSE\\a.txt");
StringBuilder stringBuilder=new StringBuilder();
int ch;
while ((ch=fr.read())!=-1){
stringBuilder.append((char) ch);
}
fr.close();
//2.排序
Integer[] arr=Arrays.stream(stringBuilder.toString()
.split("-"))
.map(Integer::parseInt)
.sorted()
.toArray(Integer[]::new);
//3.写出数据
FileWriter fw = new FileWriter("E:\\JetBrains2023\\JavaSE\\a.txt");
String s=Arrays.toString(arr).replace(",","-");
String result = s.substring(1, s.length() - 1);
fw.write(result);
fw.close();
其中map()方法是进行数据类型转换。
toArray()是将结果收集到数组中。