绝对路径和相对路径
文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。
绝对路径:从树型结构的角度来看,树中的每个结点都可以被一条从树的根结点开始,并到达该结点的路径所描述,将这种描述方式称为文件的绝对路径(Absolute Path)。
相对路径:除了从根结点出发,也可以从任意结点出发来找到目标结点,这种描述方式称为相对路径(Relative Path),相对于当前结点的一条路径。
例如test.txt文件的路径,下述描述方式就是绝对路径,以树型结构为例,即从根结点 E: 开始,到目标结点 test.txt
"E:\code_java\Java_EE\test.txt"
绝对路径通常使用 ./ 和 ../ 来进行描述,./ 表示当前目录,../ 表示上级目录,如下所示:
如果此时我们在 Java_EE 目录下,此时:
./test.txt <==> E:/code_java/Java_EE/test.txt
../test.txt <==> E:/code_java/test.txt
文件系统操作 (Java中的File类)
文件系统操作包括创建文件、删除文件、创建目录,重命名等等,Java中通过 java.io.File 类来对一个文件/目录进行抽象的描述,但有File对象,不代表就真实存在该文件,例如下列操作:
File file = new File("E:/code_java/Java_EE/test.txt");
若Java_EE目录下没有test.txt,上述这行代码是可以执行的,创建出了 File 对象,但test.txt实际上是不存在,也就是说 File 对象存在,但真实文件不一定存在。
构造方法
Java 中 File 类的构造方法有以下三种,其中第二种方式用的比较多。
File(File parent, String child) // 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例
File(String pathname) // 根据⽂件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child) // 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例,⽗⽬录⽤路径表⽰
File类常用方法
获取 File 类属性
包括获取当前所在目录、文件名、文件路径、绝对路径、相对路径
public static void main(String[] args) throws IOException {
// File file = new File("E:\\code_java\\demo\\test.txt");// 绝对路径
File file = new File("../test.txt");
// 获取当前的目录
System.out.println(file.getParent());
// 获取文件名
System.out.println(file.getName());
// 获取路径
System.out.println(file.getParent());
// 获取绝对路径
System.out.println(file.getAbsolutePath());
// 获取File对象修饰过的绝对路径
System.out.println(file.getCanonicalPath());
}
其运行结果为:
针对获取相对路径方法 getCanonicalPath 方法输出结果的解释如下:
由于我们是在 JavaEE 文件夹下运行程序的,因此我们此时所在的目录为E:\code_java\Java_EE,此时我们创建的 File 类 file 对象路径为../test.txt,即上一级目录下的 test.txt 文件,即 getCanonicalPath 方法的输出 E:\code_java\test.txt。
如果此时我们将 File 构造方法的路径改为 ./test.txt,getCanonicalPath 方法的输出是 E:\code_java\Java_EE\test.txt
创建文件
在 Java 中创建文件使用 createNewFile 方法,对于文件创建操作,我们可以使用绝对路径来创建,也可以使用相对路径来操作,例如我们要在 E:\code_java\Java_EE 目录下创建一个 test.txt 文件具体操作如下:
public static void main(String[] args) throws IOException {
File file = new File("./test.txt"); // 方式1
File file = new File("../Java_EE/test.txt"); // 方式2
File file = new File("E:/code_java/Java_EE/test.txt"); // 方式3
// 创建文件
boolean ok = file.createNewFile();
System.out.println(ok);
// 是否存在
System.out.println(file.exists());
// 是否是文件
System.out.println(file.isFile());
// 是否是目录
System.out.println(file.isDirectory());
}
运行结果为:
第一个 true 表示我们成功创建了 test.txt 文件,第二个 true 表示当前文件存在,第三个 true 表示当前 File 对象是文件,false 表示当前 File 对象不是文件夹。
在 Java 中使用 createNewFile 创建文件需要进行异常处理,原因为:①硬盘空间不足;②用户权限不足(例如用户对于该文件夹只有读权限,无写权限),只有当用户有写权限时才会正常创建,否则就会抛出异常。
删除文件
在 Java删除文件,我们使用 delete 方法,对于文件的删除操作,与创建操作类似,我们可以通过绝对路径、相对路径对其删除,具体代码如下所示:
public static void main(String[] args) {
File file = new File("./test.txt");
File file = new File("E:/code_java/Java_EE/test.txt");
File file = new File("../Java_EE/test.txt");
boolean ok = file.delete();
System.out.println(ok);
}
除了上述删除方式外,我们也可以通过 deleteOnExit 方法对文件进行删除,这种方式只有当进程结束时才进行文件删除操作,例如如下代码,我们使用 Scanner 来控制进程的结束:
public static void main(String[] args) {
// deleteOnExit 在进程退出的时候删除
File file = new File("./test.txt");
file.deleteOnExit();
System.out.println("执行删除完毕");
Scanner scan = new Scanner(System.in);
scan.next();
}
当程序运行起来后,用户任意输入一个内容即可结束进程,进程结束后也就将 test.txt 文件删除了,这就是 deleteOnExit 方法。
该方法存在的意义就是可以用来构造“临时文件”,就类似于我们在 word 中创建一个文档,此时在word 文档的同级目录下就会自动生成一个隐藏文档,一旦我们将当前编辑的文档关闭,这个隐藏文档就自动删除了。这个隐藏文件保存了我们当前正在修改而未保存的内容,当程序异常关闭时,这个文档并不会被删除,我们可以通过这个文档来还原我们正在编辑的文档。
打印目录内容
包括打印当前目录下的内容,当前目录下的内容以及当前目录下子目录的内容。
打印当前目录下的内容我们通过 list 方法来实现,具体代码如下:
public static void main(String[] args) {
File file = new File(".");
// 打印当前目录中的内容
System.out.println(Arrays.toString(file.list()));
}
如果我们想进一步打印当前目录的内容以及前目录下子目录的内容,可以利用 list 方法和 listFiles方法通过递归的方式来实现,具体代码如下:
private static void scan(File currentDir) {
// 1. 先判断是否是目录
if (!currentDir.isDirectory()) {
return;
}
// 2. 列出当前目录中包含的内容
File[] files = currentDir.listFiles();
if (files == null || files.length == 0) {
// 不存在的路径 / 空目录
return;
}
// 3. 打印当前目录
System.out.println(currentDir.getAbsolutePath());
// 4.遍历这里所有的内容,依次进行判定
for (File f : files) {
if (f.isFile()) {
// 如果是普通文件,直接打印文件路径
System.out.println(f.getAbsolutePath());
} else {
// 如果是目录,就继续进行递归
scan(f);
}
}
}
public static void main(String[] args) {
File f = new File("./");
scan(f);
}
创建文件夹
在 Java 中创建文件夹,我们使用 mkdir 和 mkdirs 两种方法,mkdir 即创建一个文件夹,mkdirs 可以创建多个文件夹。
如果我们要在当前目录下创建一个 abc 文件夹,则可以通过下列代码实现:
public static void main(String[] args) {
File f = new File("./abc");
boolean ok = f.mkdir();
System.out.println(ok);
}
如果我们要在当前目录下创建一个 abc/def/ghi/jkl 文件夹,则可以通过下列代码实现:
public static void main(String[] args) {
File f = new File("./abc/def/ghi/jkl");
boolean ok = f.mkdirs();
System.out.println(ok);
}
文件重命名和文件移动
在 Java 中,如果我们想要对文件进行重命名或者进行移动,可以通过 renameTo 方法来实现。
对文件重命名,将 abc 文件名改为 abc1234,具体代码如下:
public static void main(String[] args) {
File srcFile = new File("./abc");
File deskFile = new File("./abc1234");
boolean ok = srcFile.renameTo(deskFile);
System.out.println(ok);
}
如果我们想要移动文件的位置,例如我们想将 abc1234 文件夹下的 def 文件夹移动到当前目录 Java_EE 下,则可以通过以下代码实现,:
public static void main(String[] args) {
// 对文件进行移动
File srcFile = new File("./abc1234/def");
File deskFile = new File("./def");
boolean ok = srcFile.renameTo(deskFile);
System.out.println(ok);
}