• 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字节
    ", 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 }

    效果图:

  • 相关阅读:
    Manjaro 安装与初步使用
    hp 820 G3 驱动安装不上
    Linux Mint
    PHP模板引擎原理
    报名系统跟商品购物有点类似,可以参考一下他们的ER图
    tp5接口开发流程(思路版)
    mysql中主键和外键的作用,主表和从表如何区分,以及如何使用联合查询和TP5的联合查询
    关于会员-考生-考生自定义表单-预览打印
    PHP unserialize()和serialize两者的用法
    如何解决复杂的问题?如何在未知的领域里,解决需求?
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/12180165.html
Copyright © 2020-2023  润新知