File类的使用(一)

勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶

接下来,老蝴蝶带着大家学习一下 IO 流。 学习IO 流之前,一定要先学习一下,关于文件 File 的操作。

我们平常常说的文件File 和目录 Directory 都使用 java.io.File 类进行表示。

一. File 类的两个静态系统常量

一.一 方法

变量作用
static String pathSeparator与系统相关的路径分隔符字符,为方便起见,表示为字符串。
static String separator与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。

一.二 演示

  /**
     * 测试路径常量
     */
    @Test
   public void pathTest(){

        //windows 系统为 ; linux为 :
        System.out.println("路径分隔符:"+File.pathSeparator);
        // windows 系统为 \, linux 为 /
        System.out.println("文件分隔符:"+File.separator);
   }

控制台打印输出:

有图片

变量File.pathSeparatorFile.separator
Windows系统;\
Linux系统:/

路径拼接时,为了避免系统差异,应该用常量去连接路径。 (系统常量小写,是Java 历史原因。)

二. File 的构造方法

二.一 方法

方法作用
File​(String pathname)传入完整路径字符串, 相对路径和绝对路径都可以
File​(String parent, String child)传入父路径字符串,和当前文件名称
File​(File parent, String child)传入父文件,和当前文件名称
File​(URI uri)传入网络地址,进行构建

二.二 演示

 /**
     * 测试构造方法
     */
    @Test
   public void contrTest(){

       //1. 最常用的还是第一种, 绝对路径
       File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
       +File.separator+"Hello.txt");
       System.out.println("文件1内容长度:"+file1.length());

       // 以 src 开头, 传入相对路径
        File file11=new File("src"+File.separator+"Hello.txt");
        System.out.println("文件11内容长度:"+file11.length());

        // 2. 父路径 和 当前文件名
        File file2=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc","Hello.txt");

        System.out.println("文件2内容长度:"+file2.length());

        //3. 父文件和 当前文件名
        File parent=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc");

        File file3=new File(parent,"Hello.txt");

        System.out.println("文件3大小:"+file3.length());

        //4. 网络路径 file:/E:.... 具体的路径 
        URL url= null;
        try {
            url = new URL("file:"+File.separator+"E:"+File.separator+"ideaWork"+File.separator
+"Java2"+File.separator+"fileSrc"
                    +File.separator+"Hello.txt");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        File file4= null;
        try {
            file4 = new File(url.toURI());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        System.out.println("文件4大小:"+file4.length());
  }

控制台打印输出:

有图片

三. 文件的基本操作

包括 文件的创建,文件的删除,判断文件是否存在,文件的重命名。

三.一 方法

方法作用
boolean createNewFile​()文件不存在时,创建该文件。
boolean delete​()删除文件
boolean exists​()判断文件是否存在,如果存在,返回true,不存在,返回false
boolean renameTo​(File dest)重命名文件

三.二 演示

  /**
     * 创建,删除,判断是否存在,重命名 操作。
     */
   @Test
   public void operTest() throws Exception{
       //1. 定义一个文件, 没有这个文件
       File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
               +File.separator+"Hello2.txt");
       //如果文件存在
       if(file.exists()){
           //删除文件
           //file.delete();
           //定义新的文件
           File newFile=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                   +File.separator+"HelloNew2.txt");
           //重命名文件, 文件的内容依旧保存。
           file.renameTo(newFile);

       }else{
           //创建文件
           file.createNewFile();
       }
   }

运行程序,文件系统进行查看。 刚开始是没有这个文件 Hello2.txt 的。

第一次运行前:

有图片

第一次运行后:

有图片

再一次运行:

有图片

发现,成功 重命名了。 如果是重命名的话, 那么文件的内容依旧还是在的。

如果执行 file.delete() 的操作,那么会发现,文件成功删除了。

有图片

四. 文件查看基本信息

四.一 方法

方法作用
boolean exists​()文件是否存在,如果存在,返回true,不存在,返回false
String getAbsolutePath()获取路径在磁盘上的绝对路径
String getPath()获取文件的传入路径, 如果传入的是绝对路径,那么就返回绝对路径,
如果传入的是相对路径,就返回相对路径
long length()获取文件的大小
long lastModified()获取文件最后修改的时间, 返回时间戳,可以被修改的
String getName()获取文件的名称
String getParent()获取父路径, 返回的是父文件的路径
boolean isFile()判断是否是普通文件, 如果是普通文件,返回true,不是普通文件,返回false
boolean isDirectory()判断是否是目录, 如果是普通文件,返回false,如果是目录,返回true
File getParentFile()获取父文件,返回的是父文件

四.二 演示

//展示文件的基本的信息
   @Test
   public void showTest(){

       File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
               +File.separator+"Hello.txt");

       System.out.println("文件是否存在:"+file.exists());

       //E:\ideaWork\Java2\fileSrc\Hello.txt
       System.out.println("文件的绝对路径:"+file.getAbsolutePath());

       // E:\ideaWork\Java2\fileSrc\Hello.txt
       System.out.println("文件路径:"+file.getPath());

       System.out.println("文件大小:"+file.length());

       //可以修改的
       System.out.println("文件最后的修改时间:"+file.lastModified());

       System.out.println("文件的名称:"+file.getName());

       System.out.println("文件的父路径:"+file.getParent());

       System.out.println("文件是否是普通文件:"+file.isFile());

       System.out.println("文件是否是目录:"+file.isDirectory());
       //获取父类文件

       File parent=file.getParentFile();

       System.out.println("父类文件的名称:"+parent.getName()+",是否是目录:"+parent.isDirectory());
   }

控制台打印输出:

有图片

四.三 比较 getAbsolutePath() 和 getPath() 的区别

   //两个路径的比较
   @Test
   public void pathDiffTest(){

       //绝对路径传入
       File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
               +File.separator+"Hello.txt");

       //E:\ideaWork\Java2\fileSrc\Hello.txt
       System.out.println("文件的绝对路径:"+file1.getAbsolutePath());

       // E:\ideaWork\Java2\fileSrc\Hello.txt
       System.out.println("文件路径:"+file1.getPath());

       // 相对路径传入
       File file2=new File("src"+File.separator+"Hello.txt");

       // E:\ideaWork\Java2\src\Hello.txt
       System.out.println("文件的绝对路径:"+file2.getAbsolutePath());

        // src\Hello.txt
       System.out.println("文件路径:"+file2.getPath()+"文件名称:"+file2.length());

   }

控制台打印输出:

有图片

建议 使用 getAbsolutePath() 获取绝对路径, 然后根据绝对路径进行处理。

五. 文件的可读,可写,可执行, 最后修改时间

文件有三种权限, 可读,可写,可执行, 即 rwx

五.一 方法

方法作用
boolean canRead()文件是否可读
boolean canWrite()文件是否可写
boolean canExecute()文件是否可执行
boolean isHidden()文件是否被隐藏
boolean setReadOnly()文件设置成只读模式,此模式下 不可以写,不可以运行,只能读
boolean setWritable(boolean writable)设置文件是否可以写, 只对写操作设置,对读和运行,不造成影响
boolean setLastModified设置文件的最后修改时间
long lastModified()获取文件的最后修改时间

五.二 演示

 /*
   * 设置文件的可读,可写,可运行,最后修改时间*/
   @Test
   public void rwTest(){
       File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
               +File.separator+"Hello.txt");

       System.out.println("文件是否可读:"+file1.canRead()); //true
       System.out.println("文件是否可写:"+file1.canWrite());//true
       System.out.println("文件是否可运行:"+ file1.canExecute()); //true

       System.out.println("文件是否是隐藏的:"+file1.isHidden());//false
       //设置文件的类型
       //设置成只读
       file1.setReadOnly();
       System.out.println("看是否能写:"+file1.canWrite()); //false

       file1.setWritable(true);

       System.out.println("文件是否可写:"+file1.canWrite()); //true

       System.out.println("文件的最后修改时间:"+file1.lastModified()); //1591933582333

       file1.setLastModified(1000);
       System.out.println("文件的最后修改时间:"+file1.lastModified()); //1000

   }

控制台打印输出:

有图片

六. 关于文件目录的创建操作

六.一 方法

方法作用
boolean mkdir()创建目录,只能创建一级
boolean mkdirs()创建目录,可能递归创建多级

六.二 演示

 //目录的相关操作
   @Test
    public void DireTest(){
        //后面没有文件后缀,是一个目录。
        File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc2");
        //注意,必须保证Java2 目录一定是存在的
        if(!file.exists()&&file.isDirectory()){
            //创建目录
            file.mkdir();
        }

        //父级目录  b, 包括b的父级 a 都是不存在的。
        File file3=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"a"+File.separator+"b"+File.separator+"c");

        if(!file3.exists()){
            //不报错
            file3.mkdirs();
        }
    }

运行之后,会发现, 创建了 fileSrc2 目录, 并且 fileSrc 下,也依次创建了 a/b/c 目录。

在这里插入图片描述
如果:

  @Test
    public void Dire1Test(){
        File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"e"+File.separator+"f"+File.separator+"g");

        if(!file.exists()){
            //不报错
            file.mkdir();
        }
    }

没有 e,f,g 目录。

此时运行之后,程序不报错,但也不会创建目录。

建议,使用时, 要递归创建目录, 即 使用 mkdirs() 方法。

七. 关于文件目录的过滤查询操作

文件目录下,查询该目录下的文件信息。

七.一 方法

方法作用
String[] list()展示该目录下所有的文件名称
File[] listFiles()展示该目录下所有的文件
File[] listFiles(FilenameFilter filter)过滤后,展示符合条件的文件集合
File[] listFiles(FileFilter filter)过滤后,展示符合条件的文件集合

其中,文件过滤, 使用的是 FileFilter

@FunctionalInterface
public interface FileFilter {

    /**
     * Tests whether or not the specified abstract pathname should be
     * included in a pathname list.
     *
     * @param  pathname  The abstract pathname to be tested
     * @return  <code>true</code> if and only if <code>pathname</code>
     *          should be included
     */
    boolean accept(File pathname);
}

这个参数 File pathname, 指的是 文件。

FilenameFilter 时

@FunctionalInterface
public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}

File dir 这个参数 表示的是 当前目录。

name 表示的是目录下的各个文件名称。

七.二 演示

 @Test
    public void DireOperTest(){
       //是一个目录
        File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc");

        //只展示一级的
       String [] fileNames= file.list();

       for(String s:fileNames){
           System.out.println("文件名称:"+s);
       }
       System.out.println("***********************************");

       File[] files=file.listFiles();

       for(File f:files){
           System.out.println("文件名称:"+f.getName());
       }
       System.out.println("***********过滤操作*************");
       File[] filterFiles=file.listFiles(new FilenameFilter() {
           @Override
           public boolean accept(File dir, String name) {
              //第一个指目录文件, 第二个文件的名称。

               System.out.println("文件:"+dir.getAbsolutePath());

               System.out.println("name:"+name);

               //如果名称中包括 . 就返回 
               if(name.indexOf(".")>=0){
                   return true;
               }
               return false;
           }
       });

        System.out.println("最后过滤得到的信息1");
       for(File f:filterFiles){
           System.out.println("过滤后的文件名称:"+f.getName());
       }


        System.out.println("***********又一次过滤*************");
        File[] filter2Files=file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //指的是下面的每一个文件
                System.out.println("名称pathname:"+pathname.getAbsolutePath());

                //是文件,就返回
                if(pathname.isFile()){
                    return true;
                }
                return false;
            }
        });

        System.out.println("最后过滤得到的信息2");
        for(File f:filter2Files){
            System.out.println("过滤后的文件名称:"+f.getName());
        }
    }

控制台打印输出:

有图片

七.三 递归显示目录下的文件

关于这递归显示目录下的文件,可以参考老蝴蝶以前写的文章: 递归查询文件目录下所有的文件(八)

八. 显示所有磁盘

八.一 方法

方法作用
File[] listRoots()展示所有的磁盘信息

八.二 演示

  @Test
    public void rootTest(){

       File[] files=File.listRoots();
       for(File f:files){
           // c:\  d:\  E:\
           System.out.println("文件路径:"+f.getAbsolutePath());
       }
    }

控制台打印输出:

有图片

九. 转换成 Path

Path 是 java 1.7 之后引入的类, 用于代替 以前的 File 类。 常常与 java.nio.file.Files 类联合使用。

九.一 方法

方法作用
Path toPath()转换成 Path

九.二 演示

	@Test
    public void pathClassTest(){
        File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello.txt");

        Path path=file1.toPath();

        System.out.println("输出:"+path.getFileName());

    }

控制台打印输出:

有图片

关于 Path类和 Files 工具类,后面老蝴蝶会讲解的。


上面就是 File 类的基本操作了,必须要掌握的。

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页