1.使用字节流拷贝文件夹
import java.io.*;public class Tset01 {public static void main(String[] args) throws IOException {//拷贝一个文件夹,考虑子文件夹//E:\hello -> E:\aaaFile 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()是将结果收集到数组中。