File类比较即抽象也不抽象。玩计算机每天都能看到那么多的文件夹,文件,目录等都是File类的实体。下面是来自jdk文档的说明:
上面这个是jdk文档的说明翻译,比较死板。其实File 就是文件(打开计算机随便一个盘就能看到的),文件夹,或者叫目录、路径。因为你的一个文件也许会放的很深,之间存在着好多个文件夹。例如:D: /test1/test2/test3/test4.txt 。
这么说应该更能直观的说明这个File是什么了。但是,其实File 和我们计算机某盘中的文件还是有差异的。并不是说
new File(“D: /test1/test2/test3/test4.txt "),就能在D盘中创建出这个文件test.txt。看看上面文档的说明:File类是文件和目录路径名的抽象表示形式。这只是抽象的表达。你完全可以写个demo,然后看看你定义的文件路径是否存在就清楚。
public static void test1(){
String dirname = "D:/test1/test2/test3/test4.txt";
File f = new File(dirname);
}
那么,怎么才能在物理内存(计算机某盘)中创建出test.txt,这个文件呢? File 提供了三个方法:
1. boolean createNewFile(); 检查文件是否存在,如果不存在就创建。如果文件目录不存在,则报错:java.io.IOException: 系统找不到指定的路径。
2. boolean mkdir() ; 创建目录,如果父级目录不存在,则创建失败,返回false。
3. boolean mkdirs() ; 创建此抽象路径名指定的目录,包括所有父目录。
这里最好先理清,"文件","文件夹","目录",的关系、意思。 举个栗子: 方法1: createNewFile();.只是创建test4.txt, 其路径“test1/test2/test3”不是他创建的, 所以,如果D盘不存在这个路径,那么执行 f.createNewFile(); 就会报错。
mkdir(); 只能创建单个目录或者文件夹(单个目录只有一个文件夹),假设,要创建 "test3" 文件夹,但是系统找不到“test1/test2”的话也会报同样的错。所以,在创建文件的时候,最好先判断该路径是否存在,而创建路径最好使用第三个方法mkdirs();
public static void test2()throws Exception{
String dir = "/test1/test2/test3/test4.txt";
File f = new File(dir);
File pf = f.getParentFile();
System.out.println("pf:"+pf); //\test1\test2\test3
boolean pb = pf.exists();
System.out.println("pb:"+pb);
if(!pb) pf.mkdirs();
if(!f.exists()) {
boolean b = f.createNewFile();
System.out.println("b:"+b);
}
}
这里可能没有人注意到,我demo里面的路径并没有具体指明是在D盘,但是为何结果还是在D盘中创建呢???
这里是使用了相对路径,比起绝对路径,我觉得相对路径更灵活一点。 对于相对路径,jdk是这样解释的:
无论是抽象路径名还是路径名字符串,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。相反,相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,java.io
包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir
指定,通常是 Java 虚拟机的调用目录。
假设有一java源文件Example.java在d盘根目录下,该文件不含package信息.我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后
用”javac Example.java”来编译此文件,编译无错后,会在d盘根目录下自动生成”Example.class”文件.我们在调用”java Example”来运行
该程序.此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即
d盘根目录:D:\.同时” 当前用户目录”也是D:\.在System.getProperty(“user.dir”);系统变量”user.dir”存放的也是这个值.
我们可以多做几次试验,把”Example.class”移动到不同路径下,同时在那些路径下,执行”java Example”命令启动jvm,我们会发现这个”当前
用户目录”是不断变化的,它的路径始终和我们在哪启动jvm的路径是一致的.
上面这个例子的来源:
File的几个重要方法:
exists() 文件或文件夹是否存在。 在创建文件的时候几乎都要做这个判断
isDirectory() 是否是一个目录,如果不存在,则始终为false。区分文件和文件夹是个不错的选择,
delete() : 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。