File文件对象
在计算机系统中,文件是非常重要的存储方式。Java的标准库java.io提供了File对象来操作文件和目录。要构造一个File对象,需要通过构造方法,传入该文件的本地物理路径。
例如:
import java.io.*
public class Main{
public static void main(String[] args){
File f = new File("C:\\Windows\\notepad.exe");
System.out.println(f);
}
}
相对路径和绝对路径
构造File对象时,既可以传入绝对路径,也可以传入相对路径。绝对路径时以根目录开头的完整路径
注意:Windows平台使用 \ 作为路径分隔符,在Java字符串中需要用 \\ 表示一个 \ 。
File f = new File("C:\\Windows\\notepad.exe");
传入相对路径时,相对路径前面加上当前目录就是绝对路径,可以用 . 表示当前目录,.. 表示上级目录。
//假设当前目录是C:\Docs
File f1 = new File("sub\\javac");//绝对路径是C:\Docs\sub\javac
File f2 = new File(".\\sub\\javac");//绝对路径是C:\Docs\sub\javac
File f3 = new File("..\\sub\\javac");//绝对路径是C:\sub\javac
File对象有3中形式表示的路径,一种是getPath(),返回构造方法传入的路径,一种是getAbsolutePath(),返回绝对路径,一种是getCanonicalPath(),他和绝对路径类似,但返回的是规范路径。
Public class Main{
public static void main(String[] args){
File f = new File("..");
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
}
因为Windows和Linux的路径分隔符不同,File对象有一个静态变量用于表示当前平台的系统分隔符:
System.oput.println(File.separator);//根据当前平台打印“\”或“/”
文件操作
用File对象获取到一个文件时,还可以进一步对文件进行如下常见操作:
- boolean createNewFile():创建新文件
- boolean delete():删除文件
- boolean exists():判断文件是否存在
- String getPath():构造方法传入的路径
- String getAbsolutePath():绝对路径
- String getCanonicalPath():规范路径
- String getName:获取文件名称
- String getParent():获取文件所在父级目录名称
- File getParentFile():获取文件所在父级目录对象
- boolean isFile():判断是否是一个文件
- long lastModified():获取文件最后修改时间
- long length():文件内容的字节长度
- boolean createNewFile():创建新文件
目录操作
File对象既可以表示文件,也可以表示目录。特别要注意的是,构造一个File对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个File对象,并不会导致任何磁盘操作。只有当我们调用File对象的某些方法的时候,才真正进行磁盘操作。
例如,调用isFile(),判断该File对象是否是一个已存在的文件,调用isDirectory(),判断该File()是否是一个已存在的目录:
import java.io.*
public class Main{
public static void main(String[] args) throws IOException{
File f1 = new File("C:\\Windows");
File f2 = new File("C:\\Windows\\notepad.exe");
File f3 = new File("C:\\Windows\\nothing");
System.out.println(f1.isFile());
System.out.println(f1.isDirectory());
System.out.println(f2.isFile());
System.out.println(f2.isDirectory());
System.out.println(f3.isFile());
System.out.println(f3.isDirectory());
}
}
用File对象获取到一个目录时,还可以进一步对目录进行如下操作:
- String[] list():获取目录中所有子文件和目录的名称
- File[] listFiles():获取目录中所有子文件的目录对象
- boolean mkdir():创建当前File对象表示的目录
- boolean mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来
- boolean delete():删除当前File对象表示的目录,当前目录必须为空才能成功删除
遍历目录中的文件
当file对象表示一个目录时,可以使用list()和listFiles()列出目录下的文件和子目录名。listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:
import java.io.*;
public class Main {
public static void main(String[] args) {
File f = new File("C:\\Windows");
File[] fs1 = f.listFiles();//列出所有文件和子目录
printFiles(fs1);
File[] fs2 = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".exe");
}
});
printFiles(fs2);
}
static void printFiles(File[] files) {
if (files != null){
for (File f : files){
if (f.isDirectory()){
System.out.printf("【目录】%s\n",f.getAbsolutePath());
}else {
System.out.printf("【文件】%s(%d字节)\n",f.getName(),f.length());
}
}
}
}
}
分区操作
可以通过File类的静态方法public static File[] listRoots()获取本系统中的所有磁盘分区,每个分区可以分别通过long getTotalSpace()获取磁盘分区的总空间、可用空间、闲置空间。
import java.io.File;
public class Main {
public static void main(String[] args) {
File[] roots = File.listRoots();
for (File part : roots) {
System.out.println(part.getPath());//获取磁盘名称
System.out.println(part.getTotalSpace()/1024/1024/1024+"GB");//获取磁盘总容量
System.out.println(part.getUsableSpace()/1024/1024/1024+"GB");//获取磁盘可用空间
System.out.println(part.getFreeSpace()/1024/1024/1024+"GB");//获取磁盘空闲容量(包括未分配空间)
System.out.println();
}
}
}
小结
Java标准库的java.io.File对象表示一个文件或者目录:
- 创建File对象本身不涉及IO操作
- 可以获取路径/绝对路径/相对路径:getPath()/getAbsolutePath()/getCanonicalPath()
- 可以获取目录的文件和子目录:list()/listFiles()
- 可以创建或删除文件和目录。