电脑中存储的图片、电影、动画、资料等都是以文件方式存储的,当编写需要存储和读取文件的程序时,就需要程序支持对文件的操作。文件操作包括文件的创建与删除、读取与写入、遍历与查找。本节主要介绍文件的创建与删除、遍历与查找操作。
文件一般都存储在磁盘中,磁盘中的文件以目录树的方式组织起来,每一个目录就是一个存储文件的集合,目录下面又有子目录,形成层级目录树。当打开电脑查看某一盘符时,会看到盘符下有目录也有文件,其实盘符本身就是一个根目录,因此盘符下面既有目录也有文件。
Java把对文件和目录的操作都封装在Java.io包中,当程序需要对文件进行操作时,需要导入Java.io包到程序项目中。Java.io包提供了一个File类,用于文件和目录的创建、查找、遍历和删除。
1、用File类新建目录
File类提供了多个方法用于创建一个新的目录,分别说明如下:
● boolean mkdir()
该方法可以创建一个单级目录,目录路径在实例化File类时传入,如果目录路径包含父目录且该父目录不存在时,目录创建失败。目录创建成功返回true,创建失败返回false。
● boolean mkdirs()
该方法可以创建多级目录,目录路径在实例化File类时传入,如目录路径包含父目录且该父目录不存在时,该方法也同时创建其父目录。目录创建成功返回true,创建失败返回false。
下面的例子演示了如何应用File类创建一个新的目录。
package com.milihua.filedemo;
import java.io.File;
public class NewDirectory {
public static void main(String[] args) {
//用mkdir()创建单级目录
String dirname = "c:/java";
//实例化File对象时传入要创建的目录路径
File file = new File(dirname);
if(file.mkdir())
{
System.out.println("目录:" + dirname + "创建成功");
}
else
{
System.out.println("目录:" + dirname + "创建失败");
}
//用mkdirs()创建多级目录
dirname = "c:/java/print/data/src";
//实例化File对象时传入要创建的目录路径
file = new File(dirname);
if(file.mkdirs())
{
System.out.println("目录:" + dirname + "创建成功");
}
else
{
System.out.println("目录:" + dirname + "创建失败");
}
}
}代码分别用mkdir()和mkdirs()创建目录,mkdir()和mkdirs()不同之处是mkdir()只能创建单级目录,mkdirs()可以创建多级目录。mkdirs()方法创建的目录路径为“c:/java/print/data/src”,该路径包含多个目录,且其中的print、data、src目录都不存在,用mkdirs()可以成功创建print、data、src目录,如果用mkdir()则创建失败。
程序输出结果如下图所示:

图 16-1 创建目录示例程序输出结果
2、用File类删除目录
File类也提供了删除目录的操作,分别说明如下:
● boolean delete()
该方法用于删除文件或者一个空目录,空目录是指不包含任何内容的目录,删除成功返回true,否则返回false。
下面的例子演示了如何应用File类删除一个目录。
package com.milihua.filedemo;
import java.io.File;
public class DeleteDirectory {
public static void main(String[] args) {
//用delete方法删除目录
String dirname = "c:/java";
//实例化File对象时传入要创建的目录路径
File file = new File(dirname);
if(file.delete())
{
System.out.println("目录:" + dirname + "删除成功");
}
else
{
System.out.println("目录:" + dirname + "删除失败");
}
}
}代码删除“c:/java”目录,如果该目录下有子目录或文件,则删除失败。同理,该方法也可以用于删除文件。
3、用File类创建文件
File类提供了createNewFile和createTempFile方法用来创建文件,分别说明如下:
● boolean createNewFile ()
该方法用于创建一个新的空文件,文件存储路径由实例化File类时传入的路径指定,当路径指定的文件存在时,文件创建失败。当文件存储路径所在目录不存在时,文件也会创建失败。
● boolean createTempFile(String prefix, String suffix, File directory)
该方法用于创建临时文件,可以指定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。
下面的例子演示了如何应用File类创建一个新的文件。
package com.milihua.filedemo;
import java.io.File;
import java.io.IOException;
public class NewFile {
public static void main(String[] args) {
// TODO Auto-generated method stub
//用createNewFile()在c:/java目录下创建config.txt
String dirname = "c:/java/config.txt";
//实例化File对象时传入要创建的目录路径
File file = new File(dirname);
try {
if(file.createNewFile())
{
System.out.println("文件:" + dirname + "创建成功");
}
else
{
System.out.println("文件:" + dirname + "创建失败");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件" + dirname + "创建失败!" + e.getMessage());
}
}
}代码在用createNewFile()在c:/java目录下创建config.txt文件。如果c:/java目录不存在,则抛出异常。如下图所示:

图 16-2 创建文件失败程序抛出异常
在C盘下建立java目录,再执行该程序,文件创建成功。
4、用File类删除文件
用File类删除文件,同样也是用delete方法。不过在删除文件之前,最好判断一下该文件是否存在,否则会抛出异常。代码如下:
package com.milihua.filedemo;
import java.io.File;
public class DeleteFile {
public static void main(String[] args) {
//用delete删除c:/java目录下创建config.txt文件
String dirname = "c:/java/config.txt";
//实例化File对象时传入要删除的文件路径
File file = new File(dirname);
//用File类的exists()方法,判断被删除的文件是否存在
if (file.exists())
{
if(file.delete())
System.out.println("文件:" + dirname + "删除文件成功");
else
System.out.println("文件:" + dirname + "删除文件失败");
}
else
{
System.out.println("文件:" + dirname + "不存在");
}
}
}5、用File类遍历目录和文件
File类提供了list和listFiles方法用于获取指定目录下的文件和目录。
● File[] listFiles ()
该方法用于返回某个目录下所有文件和目录的File对象,返回的是File对象数组。
● String[] list ()
该方法用于返回某个目录下的所有文件和目录的文件名,返回的是String数组。
应用递归方法遍历指定目录下的所有子目录和文件,代码如下:
package com.milihua.filedemo;
import java.io.File;
public class TraverseFile {
public static void main(String[] args) {
File file = new File("D:\\apach");
listFiles(file);
}
public static void listFiles(File dir) {
// 如果当前文件或目录存在
if (dir.exists()) {
// 如果是目录,则:
if (dir.isDirectory()) {
// 打印当前目录的路径
System.out.println(dir);
// 获取该目录下的所有文件和目录组成的File数组
File[] files = dir.listFiles();
// 递归遍历每一个子文件
for (File file : files) {
listFiles(file);
}
}
// 如果是文件,则打印该文件路径及名称
else {
System.out.println(dir);
}
}
}
}代码应用递归技术遍历指定目录下的子目录和文件,输出结果如下图所示:

图 16-3 遍历目录和文件示例程序输出结果
■ 知识点拨
使用File类可以创建、删除、遍历目录及文件,但不能用于读写文件。