Java File类的使用

File概述

java.io.File类,具体的File类对象表示的是文件或文件目录即文件夹.在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到此类。

后续File类的对象常作为参数传递到流的构造器中,指明读取或写入的"节点",即从哪个文件读取内容以及写入到哪个文件中去。

File操作文件或文件夹,如查看路径,文件名,是否可读,可写,文件大小等;对于文件中的内容读取或写入则需要用io流,如在内存里需要将数据写到文件里

删除文件或文件夹,直接清空,不在回收站里;删除文件夹,则内部必须是空的,若有内容,则无法删除。

File类的使用

怎么创建对象

/*
    如何创建File类的实例
     */
    @Test
    public void test1(){
        /*
        构造器1,File(String FilePath)
         */
        //相对路径 ,相对于当前module
        File file1 = new File("hello.txt");

        //绝对路径 ,包含盘符在内的文件或文件夹目录
        File file2 = new File("D:\\JAVA\\IdeaProjects\\hi.txt");

        File file3 = new File("D:" + File.separator + "JAVA" + File.separator + "IdeaProjects" + File.separator + "hi.txt");

        System.out.println(file1);
        System.out.println(file2);
        System.out.println(file3);
       // D:\JAVA\IdeaProjects,Windows中识别的是这样的路径,而\在windows的java层面有转义意义

        /*
        构造器2,File(String parentPath,String childPath)
         */
        File file4 = new File("D:\\JAVA","IdeaProjects");
        System.out.println(file4);

        /*
        构造器3 File(File parentPath,String childPath)
         */

        File file5 = new File(file4,"hi.txt");
        System.out.println(file5);
        
        System.out.println(System.getProperty("user.dir")); //输出当前工程的绝对路径

    }

以FilePath为路径创建File对象,如果FilePath是相对路径,则默认的当前路径在系统属性user.dir中存储。
在这里插入图片描述

常见方法

 @Test
    public void test1(){

        File file1 = new File("hello.txt");
        File file2 = new File("D:\\JAVA\\io\\hi.txt");
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getPath());
        System.out.println(file1.getName());
        System.out.println(file1.getParent());//获取上层文件目录。没有的话,返回null
        System.out.println(file1.length()); //获取文件长度,字节数。不能获取目录的长度
        System.out.println(file1.lastModified()); //获取最后一次的修改时间,毫秒值
        System.out.println(new Date(file1.lastModified()));

        System.out.println();

        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getPath());
        System.out.println(file2.getName());
        System.out.println(file2.getParent());
        System.out.println(file2.length());
        System.out.println(file2.lastModified());
    }

在这里插入图片描述
上述是初次创建的结果;
当hello.txt创建并有内容后,测试
在这里插入图片描述

 /**
     * 用于文件目录
     */
    @Test
    public void test2(){
        File file = new File("D:\\JAVA\\IdeaProjects\\base-practice");
        //文件路径不存在的话,报空指针异常
        String[] list = file.list();
        for(String s: list){
            System.out.println(s); //文件或文件目录的名字
        }

        File[] files = file.listFiles();
        for(File file1: files){
            System.out.println(file1);
        }

    }

在这里插入图片描述

  /*
    public boolean renameTo(File dest):把文件重命名为指定的文件路径
    如file1.renameTo(file2),要想保证返回true,需要file1在硬盘中是存在的,并且file2不能在硬盘中存在
     */

    @Test
    public void test3(){
        File file1 = new File("hello.txt");
        File file2 = new File("D:\\JAVA\\io\\hi.txt");

        boolean rename = file1.renameTo(file2);
        System.out.println(rename);


    }

重命名操作是将file1所在路径下的文件相当于剪切到file2文件所在的位置处,名字更改。

在这里插入图片描述在这里插入图片描述

@Test
    public void test4(){


        File file1  = new File("hello.txt");
        System.out.println(file1.isDirectory());
        System.out.println(file1.isFile());
        System.out.println(file1.exists()); //当前对象是否在硬盘中存在对应的文件或目录
        System.out.println(file1.canRead());
        System.out.println(file1.canWrite());
        System.out.println(file1.isHidden());
        //真实存在的文件可读可写,不存在的文件获取值都是默认值false

        System.out.println();

        File file2 = new File("D:\\JAVA\\io");
        file2 = new File("D:\\JAVA\\io1");
        System.out.println(file2.isDirectory());
        System.out.println(file2.isFile());
        System.out.println(file2.exists());
        System.out.println(file2.canRead());
        System.out.println(file2.canWrite());
        System.out.println(file2.isHidden());
        //不存在的目录获取值都是默认值false
    }

内存中的File对象,实际硬盘中真实存在的话,各个属性显式赋值,若硬盘中不存在的话,创建对象时,除了指定的目录和路径之外,其他的属性都是取默认值

创建文件

/**
     * 创建对应的文件,
     * 注意,java中的删除不走回收站
     */
    @Test
    public void test5() throws IOException {
        //文件的创建
        File file1 = new File("hi.txt");
        if(!file1.exists()){
            file1.createNewFile();
            System.out.println("创建成功");
        }else{
            file1.delete();
            System.out.println("删除成功");
        }
    }

创建文件目录

 @Test
    public void test6() {
        /**
         * 文件目录的创建,如果文件目录存在,就不创建
         */

        File file1 = new File("D:\\JAVA\\io\\io1");
        boolean mkdir = file1.mkdir();
        if(mkdir){
            System.out.println("创建成功1");
        }

        File file2 = new File("D:\\JAVA\\io\\io2");
        boolean mkdir2 = file2.mkdirs();
        if(mkdir2){
            System.out.println("创建成功2");
        }
        //以上mkdir()和mkdirs()无差别

        /*File file3 = new File("D:\\JAVA\\io\\io1\\io3");
        boolean mkdir3 = file3.mkdir();
        if(mkdir3){
            System.out.println("创建成功3");
        }


        File file4 = new File("D:\\JAVA\\io\\io1\\io4");
        boolean mkdir4 = file4.mkdirs();
        if(mkdir4){
            System.out.println("创建成功4");
        }*/
        //mkdir文件目录的上层目录不存在,也不创建
        // mkdirs适用于如果上层目录不存在,一并创建
}

路径分隔符

  • 路径中的每级目录之间用一个路径分隔符隔开;

    扫描二维码关注公众号,回复: 11082027 查看本文章
  • 路径分隔符和系统有关:

  1. Windows和DOS系统默认使用“\”来表示;
  2. UNIX和URL使用“/”来表示
  • Java程序支持跨平台运行,路径分隔符慎用;

  • 解决这个隐患,File类提供了一个常量:

    public static final String separator,根据操作系统,动态提供分隔符

    示例:

    File file1 = new File("hello.txt");
    File file2 = new File("D:\\JAVA\\IdeaProjects\\hi.txt");
    File file3 = new File("D:" + File.separator + "JAVA" + File.separator + "IdeaProjects" + File.separator + "hi.txt");
    

练习1

JAVA遍历文件夹下的文件

递归调用
public static void main(String[] args) {

        traverseFolder("D:/JAVA");
        
    }

    public static  void traverseFolder(String path){
       File file = new File(path);
        if(file.exists()){
            File[] files = file.listFiles();
            if(files == null || files.length == 0){
                System.out.println("文件夹是空的");
                return;
            }else{
                for(File file1: files){
                    if(file1.isDirectory()){
                        System.out.println("文件夹:" + file1.getAbsolutePath() );
                        traverseFolder(file1.getAbsolutePath());
                    }else{
                        System.out.println("文件:"+ file.getAbsolutePath());
                    }
                }
            }
        }else{
            System.out.println("文件不存在");

        }


    }

非递归调用
public static void traverseFolder1(String path){
        int folderNum = 0 ;
        int fileNum = 0;

        File file = new File(path);
        if(file.exists()){
            LinkedList<File> list = new LinkedList<>();
            File[] files = file.listFiles();
            for(File file1: files){
                if(file1.isDirectory()){
                    System.out.println("文件夹:" + file1.getName());
                    list.add(file1);
                    folderNum++;
                }else{
                    System.out.println("文件:" + file1.getName());
                    fileNum++;

                }
            }
            System.out.println("-------------");
            File temp_file;
            while(!list.isEmpty()){
                temp_file = list.removeFirst();
                files = temp_file.listFiles();
                for(File file2: files){
                    if(file2.isDirectory()){
                        System.out.println("文件夹:"+file2.getName());
                        list.add(file2);
                        folderNum++;
                    }else{
                        System.out.println("文件:" + file2.getName());
                        fileNum++;

                    }
                }
            }

        }else{
            System.out.println("文件不存在");

        }
        
        System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);


    }

练习2

  @Test
    public void test() throws IOException {
        File file = new File("D:\\JAVA\\io\\hello.txt");
        //创建一个与file同目录下的另外一个文件
        File file1 = new File(file.getParent(),"haha.txt");
        boolean newFile = file1.createNewFile();
        if(newFile){
            System.out.println("创建成功");
        }



    }

    @Test
    public void test2(){
        File file = new File("C:\\Users\\时光\\Pictures\\alego");
        if(file.exists()){
            String[] list = file.list();
            for(String s: list){
                if(s.endsWith(".gif")){
                    System.out.println(s);
                }
            }

        }else{
            System.out.println("目录不存在");
        }
    }

通过File类对象可以访问文件的属性:

表1 File类访问属性的方法列表
   在这里插入图片描述

通过File对象创建空文件或目录

(在该对象所指的文件或目录不存在的情况下,只是内存层面的存在)

表2 File类创建文件或目录的方法列表
在这里插入图片描述

发布了37 篇原创文章 · 获赞 7 · 访问量 1607

猜你喜欢

转载自blog.csdn.net/weixin_43862596/article/details/103794109