file
用于操作文件/目录(创建、删除)、查询文件/目录状态(是否存在、是否创建成功、是否是文件/目录)
构造函数
创建抽象路径(与实际是否存在无关,可以看做是记录对应路径的载体,通过File对象实现实际的查询和操作)
几种重载:
File f =new File(String从盘符开始的完整路径);
File f =new File(String父路径,String子路径);
File f =new File(File 父File对象,String子路径);
方法
创建
public static void main(String[] args) throws IOException {
String path ="H:\\asd\\erf.txt";
File f1=new File(path);
System.out.println(f1.mkdirs());//返回true
String path2 ="H:\\asd\\erf.txt\\123";
File f2=new File(path2);
System.out.println(f2.mkdir());//返回true
String path3 ="H:\\asd\\erf.txt\\123\\123.txt";
File f3=new File(path3);
System.out.println(f3.createNewFile());//返回true
}
----------------第二次运行,前一次生成的目录和文件已存在---------
public static void main(String[] args) throws IOException {
String path ="H:\\asd\\erf.txt";
File f1=new File(path);
System.out.println(f1.mkdirs());//返回false
String path2 ="H:\\asd\\erf.txt\\123";
File f2=new File(path2);
System.out.println(f2.mkdir());//返回false
String path3 ="H:\\asd\\erf.txt\\123\\123.txt";
File f3=new File(path3);
System.out.println(f3.createNewFile());//返回false
System.out.println(f1.getName());//返回erf.txt
System.out.println(f2.getName());//返回123
System.out.println(f3.getName());//返回123.txt
System.out.println(f2.delete());//返回false,文件夹非空
System.out.println(f3.delete());//返回true,删除了文件
System.out.println(f2.delete());//返回true,文件已删除,文件夹已空可删
}
file对象.mkdir():
只能创建单级目录,
如果给的路径是多级的,且前面的路径不存在,则创建失败返回false;
如果只有最后一级不存在,创建成功返回true;
如果路径目录全都已存在,不做变动;返回false
file对象.mkdirs()
可以创建多级目录
创建成功返回true
如果路径目录全都已存在,不做变动;返回false
file对象.createNewFile()
如果文件前面的目录路径不存在,则创建失败返回false;
如果只有最后一级文件本身不存在,创建成功返回true;
如果文件本身已存在,不做变动返回false
删除
删除 file对象.delete()
如果此File对象表示目录,则目录必须为空才能删除
查询
路径 getPath(); getAbsolutePath();
绝对路径:从盘符开始
相对路径:从当前文件夹的同级文件夹开始(.\*********,*代替当前文件夹的上级文件夹)
长度 file对象.length
此处注意:
1.如果对象是文件,返回的是文件大小;对象是目录,则返回目录的大小(不是目录中的全部文件,只是文件夹本身、映射关系等占的大小);
2.新创建的没有任何文件“存在过”的文件夹,长度为0;
3.由于文件夹及其关联映射本身需要占一定内存,最小扇区划分为4096字节,故一旦存在内容,最小都是4096;
4.由于文件即便删除,在文件夹中实际仍存在(只是无法打开),故删除之后仍可能为4096;
5.同类获取文件大小的方法还有FileChannel对象.size();FileInputStream对象.available();但是这两个方法只能获取文件的大小,不能访问文件夹路径;
名称 file对象.getName()
返回file的创建路径(参数中的)最小一级的文件/文件夹名称(不是实际文件夹中最小一级)
判断
是否存在 file对象.exists()
是否为文件 file对象.isfile()
是否为文件夹 file对象.isDirectory()
遍历
file对象.list()
获取子文件/文件夹名,返回string数组
file对象.listFlies()
获取子文件/文件夹对象,返回File数组
调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
空指针异常问题
递归
即:方法中调用自身方法
禁止构造函数递归;
递归必须有次数限制且不宜过多,否则会栈内存溢出;
如图,个人理解——分为2个阶段:
------------------
第一阶段(红框内)不断向内部追溯,递归的源头(也是出口),知道找到n==1时停止递归,改为直接return一个int值;
第二阶段(蓝框内)从根源往后顺序执行,将这个“出口”--值类型不断套入递归的方法,直到到达进入方法的起源,获得递归的结果;
-----------------
递归中两部分不断做同样操作,但2部分是有关联的(比如此处n 和n-1的关联),则递归的方法的参数列表中只需要一个参数,另一个参数就是方法的结果(前面数字之和),在调用递归中已经不断获取。
案例:递归求阶乘 5到1的乘积。
public class DiGui {
public static void main(String[] args) {
int i=5;
System.out.println("阶乘结果是"+cheng(i));
}
public static int cheng(int n) {
if(n==1){
return 1;
}
return n*cheng(n-1);
}
}