Java学习-文件IO操作

1.遍历文件夹

遍历C:\WINDOWS目录下所有文件(不包括文件夹),打印出最大最小文件和它们的大小(字节)

知识点:listFiles(),length() ,isFile()

 1 package IOTest;
 2 import java.io.File;
 3 
 4 public class test {
 5     public static void main(String[] args) {
 6 
 7         File f = new File("C:/WINDOWS");
 8         File fs[] = f.listFiles();
 9         //统计最大最小值要使用的临时变量
10         int max = 0;
11         int min = (int) (Math.pow(2, 31) - 1);
12         int max_index = 0;
13         int min_index = 0;
14         
15         for (int i = 0; i < fs.length; i++) {
16             if (fs[i].isFile()) {
17                 if (fs[i].length() > max) {
18                     max = (int) fs[i].length();
19                     max_index = i;
20                 }
21                 if (fs[i].length() < min && fs[i].length() != 0) {// 最小文件不能为0字节
22                     min = (int) fs[i].length();
23                     min_index = i;
24                 }
25             }
26         }
27         System.out.printf("最大文件是%s,大小是%d字节\n", fs[max_index], max);
28         System.out.printf("最小文件是%s,大小是%d字节", fs[min_index], min);
29     }
30 }

效果图:

2.遍历文件夹(进阶)

遍历指定文件夹下的所有文件(包括所有子文件夹下的文件)

知识点:递归,全局变量,把第一问的代码进行改造即可

 1 package IOTest;
 2 
 3 import java.io.File;
 4 
 5 public class test {
 6     //不得已用了以下全局变量
 7     static int max = 0;
 8     static int min = (int) (Math.pow(2, 31) - 1);
 9     static int max_index = 0;
10     static int min_index = 0;
11     static String maxFile=null;//最大文件的名字
12     static String minFile=null;
13     
14     public static void func(File f) {
15         if (f.exists()) {
16             File fs[] = f.listFiles();        
17             for (int i = 0; i < fs.length; i++) {
18                 if (fs[i].isFile()) {//若是文件
19                     if (fs[i].length() > max) {
20                         max = (int) fs[i].length();
21                         max_index = i;
22                         maxFile=String.valueOf(fs[max_index]);
23                     }
24                     if (fs[i].length() < min && fs[i].length() != 0) {// 最小文件不能为0字节
25                         min = (int) fs[i].length();
26                         min_index = i;
27                         minFile=String.valueOf(fs[min_index]);
28                     }
29                 }else{//若是文件夹,递归调用func继续查找
30                     func(fs[i]);
31                 }
32             }
33         }
34     }
35     
36     public static void main(String[] args) {
37 
38         File f = new File("D:/Program Files (x86)");//若是C盘有可能出现指针异常,估计是文件访问权限问题
39         func(f);
40         System.out.printf("最大文件是 %s,大小是%d字节\n",maxFile,max);
41         System.out.printf("最小文件是 %s,大小是%d字节\n",minFile,min);
42     }
43 }

效果图:

3&4.写入数据到文件

找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
比如文件 test.exe,大小是471。
拆分之后,成为
test.exe-0  //100KB

test.exe-1  //100KB

test.exe-2  //100KB

test.exe-3  //100KB

test.exe-4  //71KB

3&4.把上述拆分出来的文件,合并成一个原文件。是否能正常运行,验证合并是否正确。

 1 package IOTest;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 
 9 import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
10 
11 import sun.misc.FileURLMapper;
12 
13 public class test2 {
14     public static byte[] readToFile(String path) throws IOException {
15         File f = new File(path);
16         FileInputStream fis = new FileInputStream(f);
17         byte[] data = new byte[(int) f.length()];
18         fis.read(data);
19         return data;
20     }
21 
22     // fileSplit用于分割文件,返回分割后的文件数量
23     public static int fileSplit(String path) throws IOException {
24         byte data[] = readToFile(path);// 原文件数据
25         System.out.printf("源文件总长%.1f KB%n", data.length / 1024f);
26         int i;
27         for (i = 0; i < data.length / (1024 * 100); i++) {// i作为文件序号
28             File f = new File("d:/test-" + i + ".exe");
29             FileOutputStream fos = new FileOutputStream(f);
30             fos.write(data, i * 1024 * 100, 1024 * 100);// 每100KB写完一个文件
31         }
32         // 如果剩下了部分数据,再单独写入一次
33         if (data.length - i * 1024 * 100 > 0) {
34             File f = new File("d:/test-" + i + ".exe");
35             FileOutputStream fos = new FileOutputStream(f);
36             fos.write(data, i * 1024 * 100, data.length - i * 1024 * 100);
37         }
38         System.out.println("共分割成了" + (i + 1) + "个文件");
39         return i + 1;
40     }
41 
42     // fileMerge用于合并文件
43     public static void fileMerge(int n) throws IOException {// n个分割后的文件,进行合并
44         int i;
45         int totalLength = 0;
46         // 仅仅用来计算totalLength
47         for (i = 0; i < n; i++) {
48             String path = "d:/test-" + i + ".exe";
49             File f = new File(path);
50             totalLength += f.length();
51         }
52         byte all[] = new byte[totalLength];
53         // 依次读取各个子文件的数据,统一写入all[]数组
54         for (i = 0; i < n; i++) {
55             String path = "d:/test-" + i + ".exe";
56             File f = new File(path);
57             byte tmp[] = readToFile(path);
58             System.arraycopy(tmp, 0, all, i * 1024 * 100, (int) f.length());
59         }
60         // 把数据写入合并后的文件
61         File dst = new File("d:/testMerge.exe");
62         FileOutputStream fos = new FileOutputStream(dst);
63         fos.write(all);
64         System.out.println("合并完成");
65     }
66 
67     public static void main(String[] args) throws IOException {
68 
69         int n = fileSplit("d:/test.exe");
70         fileMerge(n);
71 
72     }
73 
74 }

效果图:

 

 运行testMerge.exe,发现可以正常运行。

5.文件加密解密

加密算法:
数字:
如果不是9的数字,在原来的基础上加1,比如5变成6, 3变成4
如果是9的数字,变成0
字母字符:
如果是非z字符,向右移动一个,比如d变成e, G变成H
如果是z,z->a, Z-A。
字符需要保留大小写

其余字符保持不变。

解密算法为加密算法的逆运算

  1 package IOTest;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.FileReader;
  8 import java.io.FileWriter;
  9 import java.io.IOException;
 10 
 11 public class testStream {
 12 
 13     public static void encodeFile(File encodingFile, File encodedFile) {
 14         //all数组承接encoding File数据
 15         char all[] = new char[(int) encodingFile.length()];
 16         try (FileReader fr = new FileReader(encodingFile)) {
 17             fr.read(all);
 18         } catch (FileNotFoundException e) {
 19             // TODO Auto-generated catch block
 20             e.printStackTrace();
 21         } catch (IOException e1) {
 22             // TODO Auto-generated catch block
 23             e1.printStackTrace();
 24         }
 25         //加密过程
 26         for (int i = 0; i < all.length; i++) {
 27             if (all[i] >= '0' && all[i] < '9') {
 28                 all[i] = (char) (all[i] + 1);
 29                 continue;
 30             }
 31             if (all[i] == '9') {
 32                 all[i] = '0';
 33                 continue;
 34             }
 35             if (all[i] >= 'a' && all[i] <= 'y' || all[i] >= 'A' && all[i] <= 'Y') {
 36                 all[i] = (char) (all[i] + 1);
 37                 continue;
 38             }
 39             if (all[i] == 'z') {
 40                 all[i] = 'a';
 41                 continue;
 42             }
 43             if (all[i] == 'Z') {
 44                 all[i] = 'A';
 45                 continue;
 46             }
 47         }
 48         //把all数组写入encoded File
 49         try (FileWriter fw = new FileWriter(encodedFile)) {
 50             fw.write(all);
 51         } catch (IOException e) {
 52             e.printStackTrace();
 53         }
 54 
 55     }
 56     public static void decodeFile(File decodingFile, File decodedFile){
 57         char all[] = new char[(int) decodingFile.length()];
 58         try (FileReader fr = new FileReader(decodingFile)) {
 59             fr.read(all);
 60         } catch (FileNotFoundException e) {
 61             // TODO Auto-generated catch block
 62             e.printStackTrace();
 63         } catch (IOException e1) {
 64             // TODO Auto-generated catch block
 65             e1.printStackTrace();
 66         }
 67         //解密过程
 68         for (int i = 0; i < all.length; i++) {
 69             if (all[i] >= '1' && all[i] <= '9') {
 70                 all[i] = (char) (all[i] - 1);
 71                 continue;
 72             }
 73             if (all[i] == '0') {
 74                 all[i] = '9';
 75                 continue;
 76             }
 77             if (all[i] >= 'b' && all[i] <= 'z' || all[i] >= 'B' && all[i] <= 'Z') {
 78                 all[i] = (char) (all[i] - 1);
 79                 continue;
 80             }
 81             if (all[i] == 'a') {
 82                 all[i] = 'z';
 83                 continue;
 84             }
 85             if (all[i] == 'A') {
 86                 all[i] = 'Z';
 87                 continue;
 88             }
 89         }
 90         try(FileWriter fw=new FileWriter(decodedFile)) {
 91             fw.write(all);
 92         } catch (IOException e) {
 93             // TODO Auto-generated catch block
 94             e.printStackTrace();
 95         }    
 96     }
 97     public static void main(String[] args) throws IOException {
 98         File f1 = new File("d:/lol2.txt");
 99         FileReader fr1=new FileReader(f1);
100         
101         System.out.println("加密前的内容:");
102         char [] originData=new char[(int) f1.length()];
103         fr1.read(originData);
104         for(char x:originData){
105             System.out.print(x);
106         }
107         File f2 = new File("d:/加密后的文件.txt");
108         encodeFile(f1, f2);
109         
110         FileReader fr2=new FileReader(f2);
111         System.out.println("\n加密后的内容:");
112         char [] encodedData=new char[(int) f2.length()];
113         fr2.read(encodedData);
114         for(char x:encodedData){
115             System.out.print(x);
116         }
117         
118         File f3=new File("d:/解密后的文件.txt");
119         decodeFile(f2, f3);//解密
120         
121         System.out.println("\n解密后的内容:");
122         FileReader fr3=new FileReader(f3);
123         char []data=new char[(int) f3.length()];
124         fr3.read(data);
125         for(char x:data){
126             System.out.print(x);
127         }
128     }
129 }

效果图:

posted @ 2020-01-11 16:43  细雨轻风  阅读(276)  评论(0编辑  收藏  举报