本章内容,主要涉及文件的元信息、路径的操作,并不存在对文件的读写操作。
Java通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意:有File对象并不意味着真实存在该文件。
以下是对File的概述:
一、File的属性
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparatorChar | 依赖于系统的路径分隔符,char类 型 |
这里路径直接的分隔符是根据系统自动调整的,在开发过程中还是更推荐使用正斜杠 “ / ”。windows也支持正斜杠。
二、File的构造方法
签名 | 说明 |
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实例 |
File(String pathname) | 根据文件路径创建⼀个新的 File 实例,路径可以是绝 对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实 例,父目录用路径表示 |
这里主要介绍中间的构造方法,中间的是最常用的。注意:这里的决定路径有两种情况:
1、如果是在idea中运行程序,此时工作目录就是在项目所在的目录。
2、如果把代码打包成一个jar包,此时工作目录就是在jar包所在目录。
三、File的方法
修饰符及返回值类型 | 方法签名 | 说明 |
String | getParent() | 返回 File 对象的⽗⽬录⽂件路径 |
String | getName() | 返回 FIle 对象的纯⽂件名称 |
String | getPath() | 返回 File 对象的⽂件路径 |
String | getAbsolutePath() | 返回File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的⽂件是否真实 存在 |
boolean | isDirectory() | 判断 File 对象代表的⽂件是否是⼀个⽬录 |
boolean | isFile() | 判断 File 对象代表的⽂件是否是⼀ 个普通⽂件 |
boolean | createNewFile() | 根据 File对象,⾃动创建⼀个空⽂ 件。成功创建后返回 true |
boolean | delete() | 根据 File 对象,删除该⽂件。成功 删除后返回 true |
void | deleteOnExit() | 根据 File 对象,标注⽂件将被删 除,删除动作会到 JVM 运⾏结束时 才会进⾏ |
String[] | list() | 返回 File 对象代表的⽬录下的所有 ⽂件名 |
File[] | listFiles() | 返回 File 对象代表的⽬录下的所有 ⽂件,以 File 对象表⽰ |
boolean | mkdir() | 创建 File 对象代表的⽬录 |
boolean | mkdirs() | 创建 File 对象代表的⽬录,如果必 要,会创建中间⽬录 |
boolean | renameTo(File dest) | 进⾏⽂件改名,也可以视为我们平 时的剪切、粘贴操作 |
boolean | canRead() | 判断⽤⼾是否对⽂件有可读权 |
boolean | canWrite() | 判断⽤⼾是否对⽂件有可写权限 |
四、代码示例
1、getName,getParent,getPath方法
绝对路径的File对象,代码如下
public class IODemo1 { public static void main(String[] args) { //指定文件的路径 File f1 = new File("C:/IOTest/test.txt");//绝对路径 System.out.println(f1.getPath());//返回File对象的⽂件路径 System.out.println(f1.getParent());//返回 File 对象的⽗⽬录⽂件路径 System.out.println(f1.getName());//返回 FIle 对象的纯⽂件名称 } }
执行结果:
相对路径的File对象,代码如下
public class IODemo1 { public static void main(String[] args) { //指定文件的路径 File f1 = new File("./test.txt");//绝对路径 System.out.println(f1.getPath());//返回File对象的⽂件路径 System.out.println(f1.getParent());//返回 File 对象的⽗⽬录⽂件路径 System.out.println(f1.getName());//返回 FIle 对象的纯⽂件名称 } }
执行结果:
2、getAbsolutePath,getCanonicalPath方法
使用绝对路径创造一个File对象,代码如下
public class IODemo2 { public static void main(String[] args) throws IOException { File f = new File("C:/IOTest/test.txt");//绝对路径 System.out.println(f.getAbsolutePath());//返回File对象的绝对路径 System.out.println(f.getCanonicalPath());//返回File对象的修饰过的绝对路径 } }
执行结果:
使用相对路径创建File对象,代码如下:
public class IODemo2 { public static void main(String[] args) throws IOException { File f = new File("./test.txt");//绝对路径 System.out.println(f.getAbsolutePath());//返回File对象的绝对路径 System.out.println(f.getCanonicalPath());//返回File对象的修饰过的绝对路径 } }
执行结果:
可以看出,上面方法在绝对路径中没有啥差别,但在相对路径的就有些许差别。getCanonicalPath返回File对象的修饰过的绝对路径,也就没有了点 ' . ' 修饰。
3、exists,isDirectory,createNewFile方法
使用相对路径创建File对象,代码如下:
public class IODemo3 { public static void main(String[] args) { File f = new File("./test.txt"); boolean ret1 = f.exists();//判断 File 对象描述的⽂件是否真实存在 boolean ret2 = f.isDirectory();//判断 File 对象代表的⽂件是否是⼀个⽬录 boolean ret3 = f.isFile();//判断 File 对象代表的⽂件是否是⼀个普通⽂件 System.out.println(ret1); System.out.println(ret2); System.out.println(ret3); } }
执行结果:
4、createNewFile,delete,deleteOnExit
先创造出一个文件,使用createNewFile方法,代码如下:
public class IODemo4 { public static void main(String[] args) throws IOException { File f = new File("./test.txt"); boolean ret1 = f.createNewFile();//根据 File对象,⾃动创建⼀个空⽂件。成功创建后返回 true System.out.println(ret1); } }
执行代码前:
执行代码后:
多了test.txt文件
delete方法删除test.txt文件,代码如下:
public class IODemo4 { public static void main(String[] args) throws IOException { File f = new File("./test.txt"); boolean ret1 = f.createNewFile();//根据 File对象,⾃动创建⼀个空⽂件。成功创建后返回 true System.out.println(ret1); boolean ret = f.delete();//根据 File 对象,删除该⽂件。成功删除后返回 true System.out.println(ret); } }
执行结果:
test.txt文件没有了。
deleteOnExit方法,在程序执行完后才会删除指定的文件,代码如下:
public class IODemo4 { public static void main(String[] args) throws IOException, InterruptedException { File f = new File("./test.txt"); boolean ret1 = f.createNewFile();//根据 File对象,⾃动创建⼀个空⽂件。成功创建后返回 true System.out.println(ret1);//根据 File 对象,标注⽂件将被删除,删除动作会到 JVM 运⾏结束时才会进⾏ f.deleteOnExit(); Thread.sleep(5000); } }
执行前:
有test.txt文件。
执行后:
过5秒后才会删除test.txt文件。
5、list,listFiles,mkdir,mkdirs,renameTo方法
list:
代码如下:
public class IODemo5 { public static void main(String[] args) { File f = new File("."); String[] files = f.list();//返回 File 对象代表的⽬录下的所有⽂件名 System.out.println(Arrays.toString(files)); } }
执行结果:
listFiles:
代码如下:
public class IODemo5 { public static void main(String[] args) { // String[] files = f.list();//返回 File 对象代表的⽬录下的所有⽂件名 // System.out.println(Arrays.toString(files)); File f = new File("."); File[] files = f.listFiles();//返回File对象代表的⽬录下的所有⽂件,以File对象表⽰ System.out.println(Arrays.toString(files)); } }
执行结果:
mkdir:
代码如下:
public class IODemo6 { public static void main(String[] args) { File f = new File("./aaa");//创建 File 对象代表的⽬录 boolean ret1 = f.mkdir(); System.out.println(ret1); } }
执行前:
执行后:
多出了aaa目录。
mkdirs:
代码如下:
public class IODemo7 { public static void main(String[] args) { File f = new File("./aaa/bbb/ccc");//创建 File 对象代表的⽬录,如果必 要,会创建中间⽬录 boolean ret = f.mkdirs(); System.out.println(ret); } }
执行前:
执行后:
当前目录下多了aaa/bbb/ccc。
renameTo:
代码如下:
public class IODemo8 { public static void main(String[] args) { File src = new File("./test2.txt"); File dest = new File("./test.txt"); src.renameTo(dest);//进⾏⽂件改名,也可以视为我们平时的剪切、粘贴操作 } }
执行前:
文件名是test.txt。
执行后:
文件名是test2.txt。
除重命名功能外,renameTo还有移动功能(移动比复制、粘贴效率高,前提是在同一硬盘上)。