学习目标:掌握文件与目录的操作和使用。
目录的创建与删除
电脑中存储的图片、电影、动画、资料等都是以文件方式存储的,当编写需要存储和读取文件的程序时,就需要程序支持对文件的操作。文件操作包括文件的创建与删除、读取与写入、遍历与查找。本课主要介绍目录的创建与删除。
文件一般都存储在磁盘中,磁盘中的文件以目录树的方式组织起来,每一个目录就是一个存储文件的集合,目录下面又有子目录,形成层级目录树。当打开电脑查看某一盘符时,会看到盘符下有目录也有文件,其实盘符本身就是一个根目录,因此盘符下面既有目录也有文件。
Java把对文件和目录的操作都封装在Java.io包中,当程序需要对文件进行操作时,需要导入Java.io包到程序项目中。Java.io包提供了一个File类,用于文件和目录的创建、查找、遍历和删除。
(1)用File类新建目录
File类提供了多个方法用于创建一个新的目录,分别说明如下:
● boolean mkdir()
该方法可以创建一个单级目录,目录路径在实例化File类时传入,如果目录路径包含父目录且该父目录不存在时,目录创建失败。目录创建成功返回true,创建失败返回false。
● boolean mkdirs()
该方法可以创建多级目录,目录路径在实例化File类时传入,如目录路径包含父目录且该父目录不存在时,该方法也同时创建其父目录。目录创建成功返回true,创建失败返回false。
案例1:建立NewDirectoryTest测试类,实例化File对象,在磁盘创建新的目录。
新建项目PUnit11,在PUnit11项目新建file包,在file包下新建NewDirectoryTest类。代码如下:
package file;
import java.io.File;
public class NewDirectoryTest {
public static void main(String[] args) {
// 用mkdir()创建单级目录
String dirname = "d:/test1";
// 实例化File对象时传入要创建的目录路径
File file = new File(dirname);
if (file.mkdir()) {
System.out.println("目录:" + dirname + "创建成功");
} else {
System.out.println("目录:" + dirname + "创建失败");
}
// 用mkdirs()创建多级目录
dirname = "d:/test2/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()方法创建的目录路径为“d:/test2/print/data/src”,该路径包含多个目录,且其中的print、data、src目录都不存在,用mkdirs()可以成功创建print、data、src目录,如果用mkdir()则创建失败。
(2)用File类删除目录
File类也提供了删除目录的操作,分别说明如下:
● boolean delete()
该方法用于删除文件或者一个空目录,空目录是指不包含任何内容的目录,删除成功返回true,否则返回false。
案例2:建立DeleteDirectoryTest测试类,实例化File对象,删除在案例1创建的目录。
在file包下新建DeleteDirectoryTest类。代码如下:
package file;
import java.io.File;
public class DeleteDirectoryTest {
public static void main(String[] args) {
// 用delete方法删除目录
String dirname = "d:/test1";
// 实例化File对象时传入要创建的目录路径
File file = new File(dirname);
if (file.delete()) {
System.out.println("目录:" + dirname + "删除成功");
} else {
System.out.println("目录:" + dirname + "删除失败");
}
}
}
案例代码删除“d:/test1”目录,如果该目录下有子目录或文件,则删除失败。同理,该方法也可以用于删除文件。
文件的创建与删除
(1)用File类创建文件
File类提供了createNewFile和createTempFile方法用来创建文件,分别说明如下:
● boolean createNewFile ()
该方法用于创建一个新的空文件,文件存储路径由实例化File类时传入的路径指定,当路径指定的文件存在时,文件创建失败。当文件存储路径所在目录不存在时,文件也会创建失败。
● boolean createTempFile(String prefix, String suffix, File directory)
该方法用于创建临时文件,可以指定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。
案例3:建立NewFileTest测试类,实例化File对象,在指定的目录下创建一个新文件。
在file包下新建NewFileTest类。代码如下:
package file;
import java.io.File;
import java.io.IOException;
public class NewFileTest {
public static void main(String[] args) {
//用createNewFile()在c:/test2目录下创建config.txt
String dirname = "d:/test2/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()方法,在d:/test2目录下创建config.txt文件。如果d:/test2目录不存在,则抛出异常。
用File类删除文件
用File类删除文件,同样也是用delete方法。不过在删除文件之前,最好判断一下该文件是否存在,否则会抛出异常。
案例4:建立DeleteFileTest测试类,实例化File对象,删除案例1创建的文件。
在file包下新建DeleteFileTest类。代码如下:
package file;
import java.io.File;
public class DeleteFileTest {
public static void main(String[] args) {
// 用delete删除c:/test2目录下创建config.txt文件
String dirname = "d:/test2/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 + "不存在");
}
}
}
案例代码首先用File类的exists()方法判断待删除的文件是否存在,如果文件存在,再调用delete()方法删除文件。
遍历目录和文件
File类提供了list和listFiles方法用于获取指定目录下的文件和目录。
● File[] listFiles ()
该方法用于返回某个目录下所有文件和目录的File对象,返回的是File对象数组。
● String[] list ()
该方法用于返回某个目录下的所有文件和目录的文件名,返回的是String数组。
案例5:应用递归方法遍历指定目录下的所有子目录和文件。
在file包下新建TraverseFile类。代码如下:
package file;
import java.io.File;
public class TraverseFile {
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);
}
}
}
}
TraverseFile类用到了递归算法,递归算法就是在方法内部再次调用自身方法,就形成了递归调用。例如TraverseFile类的listFiles()方法就是递归算法,在listFiles()方法内部又调用了listFiles()方法。使用递归算法可以简化和替代循环。
在file包下新建TraverseFileTest类,测试TraverseFile类。代码如下:
package file;
import java.io.File;
public class TraverseFileTest {
public static void main(String[] args) {
// 遍历指定的目录
File file = new File("d:\\test2");
TraverseFile.listFiles(file);
}
}
TraverseFile类的listFiles()方法是静态方法,因此无需实例化TraverseFile对象就可以调用。listFiles()方法要求传入File对象,因此需要实例化File对象,并指定要遍历的目录。
程序执行结果如下图所示:

从输出结果可以看出,test2目录下有子文件夹print和三个图片文件。在print文件夹下有data目录,没有文件。在data目录下有src目录,也没有文件。