17 - IO - 递归 文件
1. 递归: 方法定义中调用方法本身的现象
直接递归 public void methodA(){ methodA(); } 间接递归 public void metohdB(){ methodC(); } public void methodC(){ methodB(); }
package cn.itcast.demo2; /* * 方法的递归调用 * 方法自己调用自己 * 适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化 * 注意: * 递归一定要有出口, 必须可以让程序停下 * 递归次数不能过多 * 构造方法,禁止递归 */ public class DiGuiDemo { public static void main(String[] args) { /*int sum = getSum(3); System.out.println(sum);*/ System.out.println(getJieCheng(5)); System.out.println(getFBNQ(12)); } /* * 方法递归,计算斐波那契数列 * */ public static int getFBNQ(int month){ if( month == 1) return 1; if( month == 2) return 1; return getFBNQ(month-1)+getFBNQ(month-2); } /* * 计算阶乘 5! * 5*4*3*2*1 */ public static int getJieCheng(int n){ if ( n == 1) return 1; return n * getJieCheng(n-1); } /* * 计算 1+2+3+100和 = 5050 * 计算规律: * n+(n-1)+(n-2) * 100+(100-1)+(99-1)+...1 */ public static int getSum(int n){ if( n == 1) return 1; return n + getSum(n-1); } }
2. 递归注意实现
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
3. File: 文件和目录路径名的抽象表示形式
构造方法: public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象 public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象 public File(File parent, String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象 路径的分类: 绝对路径, 带盘盘符 E:\Workspace\day20_File\abc.txt 相对路径, 不带盘符 注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录
4. File方法
public boolean createNewFile()创建文件 返回值为true, 说明创建文件成功 返回值为false,说明文件已存在,创建文件失败 public boolean mkdir() 创建单层文件夹 创建文件夹成功,返回 true 创建文件夹失败,返回 false public boolean mkdirs() 创建多层文件夹 public boolean delete() 删除此抽象路径名表示的文件或目录。 如果此路径名表示一个目录,则该目录必须为空才能删除 public boolean isDirectory() 判断是否为文件夹 public boolean isFile() 判断是否为文件 public boolean exists() 判断File对象对应的文件或文件夹是否存在 public String getAbsolutePath() 获取当前File的绝对路径 public String getName() 获取当前File对象的文件或文件夹名称 public long length() 获取当前File对象的文件或文件夹的大小(字节) public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径
package cn.itcast.demo; import java.io.File; /* * java.io.File * 将操作系统中的,文件,目录(文件夹),路径,封装成File对象 * 提供方法,操作系统中的内容 * File与系统无关的类 * 文件 file * 目录 directory * 路径 path */ public class FileDemo { public static void main(String[] args) { //File类静态成员变量 //与系统有关的路径分隔符 String separator = File.pathSeparator; System.out.println(separator);// 是一个分号,目录的分割 Linux : //与系统有关的默认名称分隔符 separator = File.separator; System.out.println(separator);// 向右 \ 目录名称分割 Linux / } }
package cn.itcast.demo; import java.io.File; /* * File类的构造方法 * 三种重载形式 */ public class FileDemo1 { public static void main(String[] args) { function_2(); } /* * File(File parent,String child) * 传递路径,传递File类型父路径,字符串子路径 * 好处: 父路径是File类型,父路径可以直接调用File类方法 */ public static void function_2(){ File parent = new File("d:"); File file = new File(parent,"eclipse"); System.out.println(file); } /* * File(String parent,String child) * 传递路径,传递字符串父路径,字符串子路径 * 好处: 单独操作父路径和子路径 */ public static void function_1(){ File file = new File("d:","eclipse"); System.out.println(file); } /* * File(String pathname) * 传递路径名: 可以写到文件夹,可以写到一个文件 * c:\\abc c:\\abc\\Demo.java * 将路径封装File类型对象 */ public static void function(){ File file = new File("d:\\eclipse"); System.out.println(file); } }
package cn.itcast.demo; import java.io.File; import java.io.IOException; /* * File类的创建和删除功能 * 文件或者是目录 */ public class FileDemo2 { public static void main(String[] args)throws IOException { function_2(); } /* * File类的删除功能 * boolean delete() * 删除的文件或者是文件夹,在File构造方法中给出 * 删除成功返回true,删除失败返回false * 删除方法,不走回收站,直接从硬盘中删除 * 删除有风险,运行需谨慎 */ public static void function_2(){ File file = new File("c:\\a.txt"); boolean b = file.delete(); System.out.println(b); } /* * File创建文件夹功能 * boolean mkdirs() 创建多层文件夹 * 创建的路径也在File构造方法中给出 * 文件夹已经存在了,不在创建 */ public static void function_1(){ File file = new File("c:\\abc"); boolean b = file.mkdirs(); System.out.println(b); } /* * File创建文件的功能 * boolean createNewFile() * 创建的文件路径和文件名,在File构造方法中给出 * 文件已经存在了,不在创建 */ public static void function()throws IOException{ File file = new File("c:\\a.txt"); boolean b = file.createNewFile(); System.out.println(b); } }
package cn.itcast.demo; import java.io.File; /* * File类的获取功能 */ public class FileDemo3 { public static void main(String[] args) { function_3(); } /* * File类的获取功能 * String getParent() 返回String对象 * File getParentFile()返回File对象 * 获取父路径 */ public static void function_3(){ File file = new File("d:\\eclipse\\eclipse.exe"); File parent = file.getParentFile(); System.out.println(parent); } /* * File类获取功能 * String getAbsolutePath() 返回String对象 * File getAbsoluteFile() 返回File对象 * 获取绝对路径 * eclipse环境中,写的是一个相对路径,绝对位置工程根目录 */ public static void function_2(){ File file = new File("src"); File absolute = file.getAbsoluteFile(); System.out.println(absolute); } /* * File类获取功能 * long length() * 返回路径中表示的文件的字节数 */ public static void function_1(){ File file = new File("d:\\eclipse\\eclipse.exe"); long length = file.length(); System.out.println(length); } /* * File类的获取功能 * String getName() * 返回路径中表示的文件或者文件夹名 * 获取路径中的最后部分的名字 */ public static void function(){ File file = new File("d:\\eclipse\\eclipse.exe"); String name = file.getName(); System.out.println(name); /*String path = file.getPath(); System.out.println(path);*/ // System.out.println(file); } }
package cn.itcast.demo; import java.io.File; /* * File类的判断功能 */ public class FileDemo4 { public static void main(String[] args) { function_1(); } /* * File判断功能 * boolean isDirectory() * 判断File构造方法中封装的路径是不是文件夹 * 如果是文件夹,返回true,不是文件返回false * * boolean isFile() * 判断File构造方法中封装的路径是不是文件 */ public static void function_1(){ File file = new File("d:\\eclipse\\eclipse.exe"); if(file.exists()){ boolean b = file.isDirectory(); System.out.println(b); } } /* * File判断功能 * boolean exists() * 判断File构造方法中封装路径是否存在 * 存在返回true,不存在返回false */ public static void function(){ File file = new File("src"); boolean b = file.exists(); System.out.println(b); } }
package cn.itcast.demo1; import java.io.File; /* * File类获取功能 * list * listFiles */ public class FileDemo { public static void main(String[] args) { function_2(); } public static void function_2(){ //获取系统中的所有根目录 File[] fileArr = File.listRoots(); for(File f : fileArr){ System.out.println(f); } } /* * File类的获取功能 * File[] listFiles() * 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录) * 返回的是目录或者文件的全路径 */ public static void function_1(){ File file = new File("d:\\eclipse"); File[] fileArr = file.listFiles(); for(File f : fileArr){ System.out.println(f); } } /* * File类的获取功能 * String[] list() * 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录) * 返回只有名字 */ public static void function(){ File file = new File("c:"); String[] strArr = file.list(); System.out.println(strArr.length); for(String str : strArr){ System.out.println(str); } } }
package cn.itcast.demo1; import java.io.File; /* * File类的获取,文件获取过滤器 * 遍历目录的时候,可以根据需要,只获取满足条件的文件 * 遍历目录方法 listFiles()重载形式 * listFiles(FileFilter filter)接口类型 * 传递FileFilter接口的实现类 * 自定义FileFilter接口实现类,重写抽象方法, * 接口实现类对象传递到遍历方法listFiles */ public class FileDemo1 { public static void main(String[] args) { File file = new File("c:\\demo"); File[] fileArr = file.listFiles(new MyFilter()); for(File f : fileArr){ System.out.println(f); } } }
package cn.itcast.demo1; import java.io.File; import java.io.FileFilter; /* * 自定义过滤器 * 实现FileFilter接口,重写抽象方法 */ public class MyFilter implements FileFilter{ public boolean accept(File pathname) { /* * pathname 接受到的也是文件的全路径 * c:\\demo\\1.txt * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false * 文件的后缀结尾是.java */ //String name = pathname.getName(); return pathname.getName().endsWith(".java"); } }
package cn.itcast.demo2; import java.io.File; /* * 对一个目录的下的所有内容,进行完全的遍历 * 编程技巧,方法的递归调用,自己调用自己 */ public class FileDemo { public static void main(String[] args) { File dir = new File("d:\\eclipse"); getAllDir(dir); } /* * 定义方法,实现目录的全遍历 */ public static void getAllDir(File dir){ System.out.println(dir); //调用方法listFiles()对目录,dir进行遍历 File[] fileArr = dir.listFiles(); for(File f : fileArr){ //判断变量f表示的路径是不是文件夹 if(f.isDirectory()){ //是一个目录,就要去遍历这个目录 //本方法,getAllDir,就是给个目录去遍历 //继续调用getAllDir,传递他目录 getAllDir(f); }else{ System.out.println(f); } } } }
package cn.itcast.demo2; import java.io.File; /* * 遍历目录,获取目录下的所有.java文件 * 遍历多级目录,方法递归实现 * 遍历的过程中,使用过滤器 */ public class FileDemo1 { public static void main(String[] args) { getAllJava(new File("c:\\demo")); // new File("c:\\demo").delete(); } /* * 定义方法,实现遍历指定目录 * 获取目录中所有的.java文件 */ public static void getAllJava(File dir){ //调用File对象方法listFiles()获取,加入过滤器 File[] fileArr = dir.listFiles(new MyJavaFilter()); for(File f : fileArr){ //对f路径,判断是不是文件夹 if(f.isDirectory()){ //递归进入文件夹遍历 getAllJava(f); }else{ System.out.println(f); } } } }
package cn.itcast.demo2; import java.io.File; import java.io.FileFilter; public class MyJavaFilter implements FileFilter { public boolean accept(File pathname) { //判断获取的是目录,直接返回true if(pathname.isDirectory()) return true; return pathname.getName().toLowerCase().endsWith(".java"); } }