IO流之java.io.File概述、构造方法和常用API解析

一、概述

  • 定义:是文件和目录路径名的抽象表示
  • 人话:表示的是计算机中的某个文件对象
    • 抽象指的是,File对象代表的并不是真实的文件,而是使用面向对象的思想,创建了传入路径的文件对象,提供了相关的API用于操控该文件对象
    • 文件操作一定要慎重,因为删除了并不会放到回收站,不见了就是不见了

二、部分构造方法解析

  • 下面的构造方法在后面常用API解析时会有详细的举例

File(String pathname)

  • 入参的是文件的路径名,表示的是一个文件对象
    • 表示的可以是文件夹,也可以是一个普通文件
    • 例如:"I:"、"I:\\haha"、"I:\\a\\b"、"I:\\a.txt"

File(File parent, String child)

  • 第一个参数也是File对象,表示的是父文件夹
  • 第二个参数代表的是当前File对象代表的文件名
    • 可以是文件夹,也可以是普通文件
    • 第二个参数通常创建在父目录(第一个参数)下

File(String parent, String child)

  • 和File(File parent, String child)相同,只不过第一个参数是字符串,表示的是父文件夹的路径

三、常用API解析


boolean createNewFile()

  • 创建普通文件
    • 注意创建的不是文件夹
  • 通常需要指定文件的后缀,否则创建出来的文件没有意义
  • 如果文件已经存在,返回false;文件不存在则创建文件,并返回true
  • 传入路径包含的文件夹必须存在,如果不存在则抛出异常
  • 举例
public static void main(String[] args) throws IOException {
        //a文件夹不存在,下面的代码会报错
/*        File file = new File("I:\\a\\a.txt");
        file.createNewFile();*/
        //在I盘下创建a.txt文件
        File file1 = new File("I:\\a.txt");
        file1.createNewFile();
    }


boolean mkdir()

  • 创建文件夹
    • 创建文件夹的名字,是传入路径的最后一个"\\"后面的字符串
    • 如果路径下有不存在的文件夹,该方法会报错
  • 如果需要创建的文件夹已经存在,返回false;如果需要创建的文件夹不存在,创建该文件夹并返回true
  • 举例
public static void main(String[] args) throws IOException {
        File file = new File("I:\\a\\b");
        //相当于创建b文件夹,前提是a文件夹要存在,否则运行时不报错,但是无法创建
        System.out.println(file.mkdir());
        File file2 = new File("I:\\a");
        //成功创建a文件夹
        System.out.println(file2.mkdir());
    }

boolean mkdirs()

  • 创建文件夹,同mkdir()方法,但有一点区别
    • 如果路径下存在未创建的文件夹,该方法会连带这些文件夹一同创建
  • 举例
public static void main(String[] args) throws IOException {
        File file = new File("I:\\a\\b");
        //a不存在时创建a,然后创建b
        file.mkdirs();
        File file2 = new File("I:\\c");
        //可以直接创建c
        file2.mkdirs();
    }

boolean delete()

  • 删除传入路径表示的文件或目录
  • 举例
    • 删除下图位置的666.txt文件

public static void main(String[] args) throws IOException {
        File file = new File("I:\\a\\aa\\666.txt");
        file.delete();
    }
  • 再把aa文件夹也删了
public static void main(String[] args) throws IOException {
        File file = new File("I:\\a\\aa");
        file.delete();
    }

String getName()

  • 获取文件夹或文件名称
  • 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的名字
String name = file.getName();
System.out.println(name); //a.txt

 String getParent()

  • 获取父文件夹的名称
  • 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的父文件名称
String name = file.getParent();
System.out.println(name); //I:\

File getParentFile()

  • 获取父文件夹的对象
  • 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取该文件的父文件对象
File parentFile = file.getParentFile();
System.out.println(parentFile); //I:\

String getPath()

  • 将传入的路径转换为路径名字符串
  • 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//将文件路径名变为字符串
String path = file.getPath();
System.out.println(path); //I:\a.txt

long length()

  • 获取文件的长度
    • 单位是字节
      • 1KB = 1024字节
      • 1MB = 1024KB
      • 1GB = 1024MB
  • 举例
File file = new File("I:\\a.txt");
//先创建文件
file.createNewFile();
//获取a.txt文件长度
long length = file.length();
System.out.println(length); //0,因为还没编辑任何内容

boolean exists()

  • 判断传入路径表示的文件或目录是否存在
  • 举例
File file = new File("I:\\a.txt");
//判断a.txt文件是否存在
boolean exists = file.exists();
if (!exists){
    System.out.println("文件不存在,即将创建文件");
    //创建a.txt文件
    file.createNewFile();
}else{
    System.out.println("文件存在");
}

boolean isDirectory()

  • 判断传入的路径是否代表一个文件夹
    • 如果路径代表的文件不存在,或者文件存在但不是文件夹,返回false
    • 文件存在且是文件夹,返回true
  • 举例
File file = new File("I:\\a.txt");
//a.txt文档不是一个文件夹
System.out.println(file.isDirectory()); //false
File file1 = new File("I:\\haha");
//第一次运行,未创建haha文件夹,返回false;
//第二次运行,第一次已经创建了haha文件夹,返回true
System.out.println(file1.isDirectory()); 
file1.mkdir();

boolean isFile()

  • 判断传入路径代表的是不是一个普通文件
  • 举例
File file = new File("I:\\a.txt");
//第一次运行时未创建a.txt,返回false;
//第二次运行时a.txt存在且是一个普通文件,返回true
System.out.println(file.isFile()); //false
file.createNewFile();

File file1 = new File("I:\\haha");
file1.mkdir();
//haha文件夹不是一个普通文件,返回false
System.out.println(file1.isFile());

File[] listFiles()

  • 获取文件夹里所有的文件对象,返回一个File对象数组
    • 该路径下没有其他文件,返回null
    • 如果有隐藏文件,也会包含在数组中
  • 举例
File file = new File("I:");
//查找I盘下的所有文件
File[] files = file.listFiles();
//[I:!金山毒霸免疫勒索病毒 勿删除, I:$RECYCLE.BIN, I:a, I:a.txt, I:b, I:haha, I:System Volume Information]
System.out.println(Arrays.toString(files));
File file2 = new File("I:\\a");
//查找a文件下的所有文件
File[] files2 = file2.listFiles();
System.out.println(Arrays.toString(files2)); //[I:\a\aaa, I:\a\bbb]

String[] list()

  • 同listFiles()方法,区别在于返回的是字符串数组
  • 举例
File file = new File("I:");
//查找I盘下的所有文件
String[] files = file.list();
//[I:!金山毒霸免疫勒索病毒 勿删除, I:$RECYCLE.BIN, I:a, I:a.txt, I:b, I:haha, I:System Volume Information]
System.out.println(Arrays.toString(files));
File file2 = new File("I:\\a");
//查找a文件下的所有文件
String[] files2 = file2.list();
System.out.println(Arrays.toString(files2)); //[I:\a\aaa, I:\a\bbb]

boolean renameTo(File dest)

  • 重命名此抽象路径表示的文件
  • 人话
    • 就是一个剪切文件+重命名操作
    • 将调用者代表的文件,剪切到被调用者的路径下,并以被调用者路径的最后一段进行重命名操作
    • 看一下例子就明白
  • 举例
  • 原来的文件目录结构
    • I盘里有a文件夹、b文件夹
      • a文件夹为空
      • b文件夹下有一个bb文件夹、一个bb.txt文件
        • bb文件夹下有个666.txt文件

  •  执行代码
File file1 = new File("I:\\a\\aa");
File file2 = new File("I:\\a\\aa.txt");
//b文件夹下的bb文件夹(需要被转移的文件)
File file3 = new File("I:\\b\\bb");
//b文件夹下的bb.txt文件(需要被转移的文件)
File file4 = new File("I:\\b\\bb.txt");
//将bb文件夹转移到a文件夹,并重命名为aa文件夹(原bb文件夹下的东西还存在)
file3.renameTo(file1);
//将bb.txt转移到a文件夹下,重命名为aa.txt
file4.renameTo(file2);

  • 执行上面代码后的目录结构
    • a文件夹下多了一个aa文件夹(原来的bb文件夹)、aa.txt文件(原来的bb.txt文件)
      • aa文件夹下有一个666.txt文件(原来bb文件夹下的666.txt文件)
    • b文件夹下的所有文件没了

 

四、File的常量字段

  •  File类提供了四个常量字段,用于表示系统相关的路径分隔符或系统相关的名称分隔符
  • 定义这些常量的目的
    • 不同操作系统对于文件路径的路径分隔符、名称分隔符可能不同。java具有跨平台性,如果写死这些符号,在不同的操作系统不一定能运行,因此引入了这些常量
    • 分隔符的区别如下表所示
操作系统名称 Windows Linux
名称分隔符 \ /
路径分隔符 ; :
  •    举例
//与系统相关的路径分隔符
System.out.println(File.pathSeparator); //;
//与系统相关的默认名称分隔符
System.out.println(File.separator); //\

五、File的应用举例

  • 需求
    • 需要查找指定路径下的所有png格式照片,且大小大于20KB
  • 思路
    • 使用listFiles()方法获取该路径下的所有文件对象
    • 自定义方法遍历数组的所有文件
      • 如果文件是文件夹
        • 使用listFiles()方法获取该文件夹下的所有文件对象
        • 递归调用自定义方法进行遍历
      • 如果文件是普通文件
        • 使用getName()方法获取文件名字,判断后缀是否以png结尾
          • 判断大小是否大于20*1024(1KB = 1024B)
            • 满足条件,打印路径和文件信息
  • 代码
package File;

import java.io.File;

/**
 * 查找指定路径下大于20KB的png文件
 */
public class demo2 {
    public static void main(String[] args) {
        File file = new File("I:\\mypicture");
        //获取该文件下的所有文件对象
        File[] files = file.listFiles();
        //调用自定义方法
        filesList(files);
    }

    public static void filesList(File[] files){
        //传入的文件集合不能为空,长度必须大于0
        if (files!=null && files.length>0){
            int count = 1;
            for (File file : files) {
                count++;
                if (file.isFile()){
                    //是文件
                    //判断文件是否以jpg结尾
                    if (file.getName().endsWith(".png")){
                        //如果文件大于20KB
                        if (file.length()>20*1024){
                            //输出图片名称+文件路径
                            System.out.println("文件名:"+file.getName()+" ,文件大小:"+file.length()/1024
                                    +"KB ,文件路径:"+file.getAbsolutePath());
                        }
                    }
                }else{
                    //是文件夹
                    //获取该文件夹下的所有文件集合
                    File[] files1 = file.listFiles();
                    //递归调用自定义方法
                    filesList(files1);
                }
            }
        }
    }
}
  • 运行效果

六、绝对路径和相对路径

  • 绝对路径
    • 从盘符开始,编写的是一个完整的路径
    • 不论什么时候,该路径永远只代表这一个固定位置的文件
    • 例如: c://a.txt 
  • 相对路径
    • 没有盘符,仅仅写的是某个文件的名称
    • 在java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在java开发中很常用
    • 例如: a.txt
      • 打印出来的路径:项目路径名+a.txt
  • 代码举例
public static void main(String[] args) {
    File f1 = new File("I:\\a.txt");
    File f2 = new File("a.txt");
    //I:\a.txt  绝对路径
    System.out.println(f1.getAbsolutePath());
    //H:\KKB_IDEA\project1102\a.txt  相对路径
    System.out.println(f2.getAbsolutePath());
}

猜你喜欢

转载自blog.csdn.net/future_god_qr/article/details/121181486