java -- File类和递归

打印 上一主题 下一主题

主题 1843|帖子 1843|积分 5529

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
File类

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File类将文件,文件夹和路径封装成了对象,提供大量的方法来操作这些对象。
静态常量
  1. // 静态常量
  2. static String pathSeparator // 与系统有关的路径分隔符
  3.         // Window操作系统,分隔符是分号;
  4.         // Linux操作系统,分隔符是冒号:
  5. static String separator // 与系统有关的名称分隔符
  6.         // Window操作系统,名称分割符号为 \
  7.         // Linux操作系统,名称分隔符号为 /
复制代码
绝对路径和相对路径


  • 绝对路径:从盘符(Windows)或"/"(Linux)开始的路径,这是一个完整的路径,绝对路径具有唯一性
  • 相对路径:相对于某个目录的路径,这是一个便捷的路径,开发中经常使用,java中写的相对路径, 一般都是相对于当前项目
  1. // Windows绝对路径 Windows
  2. String path1 = "E:\\study\\java\\5_projects\\FileClass\\test";
  3. String path2 = "/opt/html/dist"
  4. // 相对路径
  5. String path3 = "FileClass\\test";
复制代码
构造方法
  1. public File(String pathname)
  2. // 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
  3. public File(String parent, String child)
  4. // 从父路径名字符串和子路径名字符串创建新的 File实例
  5. public File(File parent, String child)
  6. // 从父抽象路径名和子路径名字符串创建新的 File实例
复制代码
  1. // 根据给定的路径 创建File对象
  2. File file1 = new File("E:\\study\\java\\5_projects\\FileClass\\test");
  3. System.out.println(file1.toString() + "\t " + file1.getPath());
  4. // 传入字符串的父路径 和 字符串的子路径 创建File对象
  5. File file2 = new File("E:\\study\\java\\5_projects\\FileClass","test");
  6. System.out.println(file2);
  7. File file3 = new File("E:\\study\\java\\5_projects","\\FileClass\\test");
  8. System.out.println(file3);
  9. // 传入File类型的父路径 和 字符串类型的子路径
  10. File file4 = new File(file1, "1.txt");
  11. System.out.println(file4);
复制代码
注意:

  • 一个File对象代表硬盘中实际存在的一个文件或者目录。
  • 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
获取某些属性
  1. public File getAbsoluteFile() // 获取绝对路径(File类型)
  2. public String getAbsolutePath() // 获取绝对路径(字符串类型)
  3. public String getPath() // 返回字符串类型的路径
  4. public String getName() // 获取文件名
  5. public long length() // 获取文件字节数, 不存在返回0
  6. public File getParentFile() //返回File类型的父路径
  7. public long lastModified() // 返回最后修改时间
复制代码
  1. // 获取绝对路径(字符串类型)
  2. System.out.println("绝对路径为: " + new File("FileClas\\src").getAbsoluteFile());
  3. System.out.println(file4.getAbsolutePath());
  4. // 获取绝对路径(File类型)
  5. System.out.println(file4.getAbsoluteFile());
  6. // 获取相对路径下的File对象
  7. File file6 = new File("FileClass" + File.separator + "test" + File.separator + "2.txt");
  8. System.out.println(file6.getAbsolutePath());
  9. // 获取字符串类型的路径 直接打引结果相同
  10. // 直接打印(toString)调用了getPath方法
  11. System.out.println(file1.getPath());
  12. // 获取文件名
  13. System.out.println(new File("FileClass/test/1.txt").getName());
  14. // 获取文件字节数, 不存在返回0
  15. long fileLength = new File("FileClass/test/1.txt").length();
  16. System.out.println(fileLength);
  17. // 获取父路径, 返回File对象
  18. File parentFile = new File("FileClass/test/1.txt").getParentFile();
  19. System.out.println(parentFile);
  20. System.out.println(parentFile.getParentFile());
  21. // 获取最后修改时间
  22. long lastModifyTime = new File("FileClass/test/1.txt").lastModified();
  23. System.out.println(lastModifyTime + "\t" + new Date(lastModifyTime));
复制代码
判断的方法
  1. public boolean exists()
  2. // 判断路径是否存在, 存在返回true
  3. public boolean isFile()
  4. // 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回false
  5. public boolean isDirectory()
  6. // 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回false
复制代码
  1. // 判断路径是否存在, 存在返回true
  2. System.out.println(new File("FileClass/test/NewDir1").exists());
  3. // 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回false
  4. System.out.println(file6.isFile());
  5. // 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回false
  6. System.out.println(new File("FileClass/test/NewDir1").isDirectory());
  7. // 因此 判断某文件是文件/文件夹时 要先判断路径是否存在
  8. if (file1.exists()) {
  9.     if(file1.isFile()) {
  10.         System.out.println("文件");
  11.     } else {
  12.         System.out.println("目录");
  13.     }
  14. } else {
  15.     System.out.println("文件不存在");
  16. }
复制代码
创建和删除文件
  1. public boolean createNewFile() throws IOException
  2. // 创建文件, 成功返回true, 存在则不创建
  3. public boolean mkdir()
  4. // 创建单级目录, 成功返回true, 存在则不创建
  5. public boolean mkdirs()
  6. // 创建单/多级目录, 成功返回true, 存在则不创建
  7. public boolean delete()
  8. // 删除文件或空目录, 成功返回true
复制代码
  1. // 创建文件, 成功返回true, 失败返回false
  2. System.out.println(file6.createNewFile());
  3. // 创建目录, 成功返回true, 失败返回false
  4. System.out.println(new File("FileClass/test/NewDir1").mkdir());
  5. System.out.println(new File("FileClass/test/NewDir2/NewDir3/NewDir4").mkdirs());
  6. // 删除文件 和 空目录
  7. System.out.println(file6.delete());
  8. System.out.println(new File("FileClass/test/NewDir1").delete());
  9. // 创建目录
  10. //StringBuilder sb = new StringBuilder("FileClass/test/");
  11. //for (int i = 0; i < 200; i++) {
  12. //    sb.append(i);
  13. //    sb.append("/");
  14. //}
  15. //System.out.println(new File(sb.toString()).mkdirs());
  16. //
  17. //删除目录
  18. //File fileForDel = new File(sb.toString());
  19. //do {
  20. //    try {
  21. //        if (Integer.parseInt(fileForDel.getName()) < 0) {
  22. //            System.out.println("删除失败");
  23. //            return;
  24. //        }
  25. //    } catch (NumberFormatException e) {
  26. //        return;
  27. //    }
  28. //    fileForDel.delete();
  29. //    fileForDel = fileForDel.getParentFile();
  30. //} while (true);
复制代码
遍历目录
  1. public String[] list()
  2. // 返回目录下所有文件 存放在字符串数组中
  3. public File[] listFiles()
  4. // 返回目录下所有文件 存放在File数组中
复制代码
  1. String[] arr = new File("FileClass/test").list();
  2. for (String s : arr) {
  3.     System.out.println(s);
  4. }
  5. File[] fileArr = new File("FileClass/test").listFiles();
  6. for (File file : fileArr) {
  7.     System.out.println(file + "\t" + file.getName());
  8. }
复制代码
FileFilter接口

文件过滤器接口,此接口的实现类可以传递给方法listFiles(),实现文件的过滤功能
public boolean accept(File path):方法参数就是listFiles()方法获取到的文件或者目录的路径。如果方法返回true,表示需要此路径,否则此路径将被忽略。
  1. File dir = new File(".\\ConcurrentProgramming\\src\\_5_ThreadPool");
  2. File[] files = dir.listFiles(new FileFilter() {
  3.     @Override
  4.     public boolean accept(File pathname) {
  5.         //判断如果获取到的是目录,直接放行
  6.         if(pathname.isDirectory())
  7.             return true;
  8.         //获取路径中的文件名,判断是否java结尾,是就返回true
  9.         return pathname.getName().toLowerCase().endsWith("java");
  10.     }
  11. });
  12. for(File file : files){
  13.     System.out.println(file);
  14. }
复制代码
递归

指在当前方法内调用自己的这种现象。
  1. public static void a(){
  2.     a();
  3. }
复制代码
递归求和

计算1 ~ n的和

分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
实现代码:
  1. public static void main(String[] args) {
  2.     //计算1~num的和,使用递归完成
  3.     int num = 5;
  4.     // 调用求和的方法
  5.     int sum = getSum(num);
  6.     // 输出结果
  7.     System.out.println(sum);
  8. }
  9. public static int getSum(int num) {
  10.     /*
  11.     num为1时,方法返回1,
  12.     相当于是方法的出口,num总有是1的情况
  13.     */
  14.     if(num == 1){
  15.             return 1;
  16.     }
  17.     /*
  18.     num不为1时,方法返回 num +(num-1)的累和
  19.     递归调用getSum方法
  20.     */
  21.     return num + getSum(num-1);
  22. }
复制代码
递归求阶乘

阶乘:所有小于及等于该数的正整数的积。
分析:n的阶乘:n! = n * (n-1) ... 3 * 2 * 1
  1. //计算n的阶乘,使用递归完成
  2. public static void main(String[] args) {
  3.     int n = 3;
  4.     // 调用求阶乘的方法
  5.     int value = getValue(n);
  6.     // 输出结果
  7.     System.out.println("阶乘为:"+ value);
  8. }
  9. public static int getValue(int n) {
  10.     // 1的阶乘为1
  11.     if (n == 1) {
  12.             return 1;
  13. }
  14.     /*
  15.     n不为1时,方法返回 n! = n*(n-1)!
  16.     递归调用getValue方法
  17.     */
  18.     return n * getValue(n - 1);
  19. }
复制代码
目录遍历

遍历目录下的所有文件和所有的子目录。
分析:目录遍历,无法判断多少级目录,所以在遍历需要进行判断,如果遍历到的还是目录,就要使用递归,遍历所有目录。
  1. public static void main(String[] args){
  2.     // 创建File对象
  3.     show(new File("./").getAbsoluteFile());
  4. }
  5. public static void show(File dir) {
  6.     // 获取子文件和目录
  7.     File[] files = dir.listFiles();
  8.     // 循环打印
  9.     for (File file : files) {
  10.         //判断是文件,直接输出
  11.         if (file.isFile()) {
  12.             System.out.println(file);
  13.         } else {
  14.             // 是目录,继续遍历,形成递归
  15.             show(file);
  16.         }
  17.     }
  18. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表