Logo

郎哥编程

文件与目录

2021-07-07 231

学习目标:掌握文件与目录的操作和使用。

目录的创建与删除

电脑中存储的图片、电影、动画、资料等都是以文件方式存储的,当编写需要存储和读取文件的程序时,就需要程序支持对文件的操作。文件操作包括文件的创建与删除、读取与写入、遍历与查找。本课主要介绍目录的创建与删除。

文件一般都存储在磁盘中,磁盘中的文件以目录树的方式组织起来,每一个目录就是一个存储文件的集合,目录下面又有子目录,形成层级目录树。当打开电脑查看某一盘符时,会看到盘符下有目录也有文件,其实盘符本身就是一个根目录,因此盘符下面既有目录也有文件。

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对象,并指定要遍历的目录。

程序执行结果如下图所示:

10.png

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

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论