目录
程序在运行过程中经常需要获取磁盘上的文件信息或者在磁盘上创建新的文件或文件夹夹,这就需要使用Java提供的File类来对文件和文件夹进行操作。File类表示一个与平台无关的文件或文件夹。File类的对象可以创建文件和文件夹,以及获取文件和文件本身的一些信息,但不涉及对文件内容的读写操作。
1. File对象的创建
由于每个File类对象对应系统中的一个文件或文件夹,所以创建File类的对象需要给出其所对应的文件名或文件夹名。File类有三个构造方法,其定义如下:
- File(String path):根据path来创建File对象,如果path是实际存在的文件夹,则该File对象表示的是文件夹,如果是path是文件名,则该File对象表示的是文件。
- File(String path, String name):以path为路径,以name为文件或文件夹名创建File对象。
- File(File dir, String name):用于一个已经存在的File对象dir作为文件夹,以name为文件或文件夹名来创建File对象。
例如,下面的第一条语句所创建File对象表示文件夹,后三条语句所创建的File对象表示文件。
File dir=new File("D:\\examples");//File对象表示文件夹
File file1=new File("D:\\examples\myfile1.txt");//File对象表示文件
File file2=new File("D:\\examples","myfile2.txt");//File对象表示文件
File file3=new File(dir,"myfile3.txt");//File对象表示文件
File对象所对应的文件或文件夹也以可以不存在,可以使用File类的exists()方法判断文件或文件夹是否存在。
2. 获取文件或文件夹的属性
创建File对象后,就可调用它所提供的相应方法来获取其所对应的文件或文件夹的属性,常见的方法如下:
- String getName():返回文件或文件夹的名称,不包含路径信息。
- String getPath():返回文件或文件夹完整的路径和名称。
- String getParent():返回文件或文件夹完整的父目录。
- boolean exists():判断文件或文件夹是否存在。
- boolean isFile():判断File对象是否表示已存在的文件。
- boolean isDirectory():判断File对象是否表示已存在的文件夹。
- long length():返回文件的大小(以字节为单位)。
- boolean isHidden():判断文件或文件夹是否隐藏。
- boolean canRead():判断文件是否可读。
- boolean canWrite():判断文件是否可写。
- long lastModified():获取文件或文件夹最后修改的时间。
- boolean equals(File f):比较两个文件或文件夹是否相等。
3. 文件夹的管理
当一个File对象表示一个文件夹时,调用它的mkdir()方法可以在磁盘上创建该文件夹,如果创建成功返回true,如果该文件夹已经存在或者创建失败,则返回false。例如,
File file=new File("D:\\examples"); //File对象表示文件夹
file.mkdir(); //创建文件夹“D:\\examples”
如果一个File对象表示一个文件夹,那么调用它的如下两个方法可以返回其所包含的所有文件和子文件夹。
- String[] list():返回文件夹中的所有文件和子文件夹的名称。
- File[] listFiles():返回文件夹中的所有文件和子文件夹的File对象。
【例1】列出当前文件夹中所有文件和子文件夹的名称、最后修改日期等信息。
import java.io.File;
import java.sql.Date;
public class DirectoryDemo{
public static void main(String[] args) {
File dir=new File(".");
File[] files=dir.listFiles();
System.out.println();
for(File file:files) {
if(file.isFile()) {
System.out.println(file.getName()+"\t"+
new Date(file.lastModified())+"\t"+
file.length()+"\t"+
"文件");
}
if(file.isDirectory()) {
System.out.println(file.getName()+"\t"+
new Date(file.lastModified())+"\t"+
"文件夹");
}
}
}
}
FilenameFilter接口实现类的主要功能是对文件进行筛选,利用FileFilter接口实现类,可以实现对文件夹的筛选。例如,下面定义的FileFilterImpl类实现了FileFilter接口,其功能是获取当前文件夹中的子文件夹以及以.java为后缀的文件。
class FileFilterImpl implements FileFilter{
public boolean accept(File path) {
//检查path是否为文件夹
if(path.isDirectory()) {
return true;
}
//检查path是否以.java为后缀
return path.getName().endsWith(".java");
}
}
【例2】下面的程序列出当前文件夹的子文件夹以及以.java为后缀的文件。
import java.io.File;
import java.io.FileFilter;
public class DirectoryDemo1 {
public static void main(String[] args) {
File dir=new File(".");
FileFilter fileFilter=new FileFilterImpl();
File[] files=dir.listFiles(fileFilter);
for(File file:files) {
System.out.println(file.getPath());
}
}
}
4. 文件的创建与删除
File类提供了创建和删除文件方法,其定义如下:
- boolean createNewFile():当一个File对象表示一个文件时,如果该文件在磁盘中不存在,调用该方法可以在磁盘上创建一个新的文件,如果创建成功返回true,否则返回false。
- boolean delete():当File对象表示一个文件时,调用该方法删除该文件,当File对象表示一个文件夹时,调用该方法删除该文件夹及其包含的文件和子文件夹,如果删除成功返回true,否则返回false。
例如,下面的代码在当前文件夹中创建文件test.java,创建文件会抛出IO异常,因此,需要增加try-catch语句。
File file=new File("D:\\examples","test.java");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
调用delete方法可以删除当前文件,例如:
file.delete();
5. 运行可执行文件
如果在程序中执行一个本地机器上的可执行文件,可以使用java.lang包中Runtime类,具体步骤如下。
步骤1:首先使用Runtime类声明一个对象,例如:
Runtime runtime;
步骤2:然后使用Runtime类的getRuntime()静态方法创建这个对象,例如:
runtime=Runtime.getRuntime();
步骤3:最后,调用Runtime类对象的exec(String command)方法执行本地机器上的一个可执行文件,例如,执行C:\Program Files (x86)\Notepad++目录下的notepad++.exe文件的代码如下:
File file=new File("C:\\Program Files (x86)\\Notepad++\\notepad++.exe");
try {
runtime.exec(file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}