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字节
", 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字节
",maxFile,max);
41 System.out.printf("最小文件是 %s,大小是%d字节
",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("
加密后的内容:");
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("
解密后的内容:");
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 }
效果图: