Java IO (1) -- File 类

1. 概念

文件和目录路径名的抽象表示方式,File 类可以用于文件和目录的创建、文件查找和文件删除等。File 类实现了 Serializable 和 Comparable 接口,可以进行序列化和文件大小的比较.

路径分隔符:

  1. windows: "/" "" 都可以
  2. linux/unix: "/"
  3. 注意:如果 windows 选择用""做分割符的话,那么请记得替换成"\",因为 Java 中""代表转义字符
    所以推荐都使用"/",也可以直接使用代码 File.separator,表示跨平台分隔符。

路径:

  1. 相对路径:./表示当前路径,../表示上一级路径,其中当前路径:默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
  2. 绝对路径:绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件

2. 字段

  1. private static final FileSystem fs = DefaultFileSystem.getFileSystem():返回平台默认的文件系统对象
    private final String path:路径名字符串
    private static enum PathStatus { INVALID, CHECKED }:表示的是文件路径的状态
    private transient PathStatus status = null:用来标识文件路径是否有效
    private final transient int prefixLength:抽象路径名的前缀的长度
    public static final char separatorChar:系统依赖的默认名称分割符.在UNIX系统中是/,在Microsoft Windows系统中是//
    public static final String separator:系统依赖的默认名称分割符.在UNIX系统中是/,在Microsoft Windows系统中是//
    public static final char pathSeparatorChar:在UNIX系统中是:,在Microsoft Windows系统中是;
    public static final String pathSeparator:在UNIX系统中是:,在Microsoft Windows系统中是;

3. 方法

1. 构造器

  1. File(String pathname):File f1 =new File("c:\\abc\\1.txt");
  2. File(String parent,String child):File f2 =new File("c:\\abc","2.txt");
  3. File(File parent,String child):
    File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符
    File f4 =new File(f3,"3.txt");
    
  4. public File(URI uri) {}:将给定的 file:URI 转成抽象路径名创建一个 File 对象
    URI uri = new URI("file:D:/java/home"); //注意格式是"file:/D:/java/home"
    File file = new File(uri);
    

2. 创建与删除方法

  1. boolean createNewFile():如果文件存在返回 false,否则返回 true 并且创建文件
  2. boolean mkdir():创建一个 File 对象所对应的目录,成功返回 true,否则 false。且 File 对象必须为路径而不是文件。只会创建最后一级目录,如果上级目录不存在就抛异常。
  3. boolean mkdirs():创建一个 File 对象所对应的目录,成功返回 true,否则 false。且 File 对象必须为路径而不是文件。创建多级目录,创建路径中所有不存在的目录也一起创建
  4. boolean delete():如果文件存在返回 true 并且删除文件,否则返回 false
  5. void deleteOnExit():在虚拟机终止时,删除 File 对象所表示的文件或目录。

3. 判断方法

  1. boolean canExecute():判断文件是否可执行
  2. boolean canRead():判断文件是否可读
  3. boolean canWrite():判断文件是否可写
  4. boolean exists():判断文件是否存在
  5. boolean isDirectory():判断是否是目录
  6. boolean isFile():判断是否是文件
  7. boolean isHidden():判断是否是隐藏文件或隐藏目录
  8. boolean isAbsolute():判断是否是绝对路径,文件不存在也能判断

4. 获取方法

  1. String getName():返回文件或者目录的名称
  2. String getPath():返回路径
  3. String getAbsolutePath():返回绝对路径
  4. String getParent():返回父目录,如果没有父目录则返回 null
  5. long lastModified():返回最后一次修改的时间
  6. long length():返回文件的长度
  7. File[] listRoots(): 列出所有的根目录(Window 中就是所有系统的盘符)
  8. String[] list():返回一个字符串数组,给定路径下的文件或目录名称字符串
  9. String[] list(FilenameFilter filter):返回满足过滤器要求的一个字符串数组
  10. File[] listFiles():返回一个文件对象数组,给定路径下文件或目录
  11. File[] listFiles(FilenameFilter filter):返回满足过滤器要求的一个文件对象数组

接口 FileNameFilter 是个文件过滤器,包含了一个 accept(File dir,String name) 方法,该方法依次对指定 File 的所有子目录或者文件进行迭代,按照指定条件,进行过滤,过滤出满足条件的所有文件。

// 文件过滤
File[] files = file.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File file, String filename) {
        return filename.endsWith(".mp3");
    }
});

表示:file 目录下的所有子文件如果满足后缀是 .mp3 的条件的文件都会被过滤出来

4. 案例

public class FileDemo {
  public static void main(String[] args) throws IOException, URISyntaxException {
    //testCreateDirectory();
    //testCreateFile();
    //testOtherMethod();
    File file = new File("D:/java");
    //testAllFileDelete(file);
  }
  /**
   * 递归调用删除所有文件
   */
  private static void testAllFileDelete(File file) {
    if(file==null||!file.exists()) return;
    if(file.isDirectory()) {
      File[] listFiles = file.listFiles();
      for(File delFile :listFiles) {
        testAllFileDelete(delFile);
      }
    }
    file.delete(); 
  }
  private static void testOtherMethod() {
    File file = new File("D:/java/test.txt");
    System.out.println("文件是否存在file.exists-----"+file.exists());
    System.out.println("文件绝对路径file.getgetAbsolutePath()------"+file.getAbsolutePath());
    System.out.println("文件名file.getName()-----"+file.getName());
    System.out.println("file.getParentFile()------"+file.getParentFile());
    System.out.println("父级目录路径名file.getParent()-----"+file.getParent());
    System.out.println("uri的路径file.toURI()------"+file.toURI());
    System.out.println("最后修改时间file.getLastModified()-----"+file.lastModified());
    System.out.println("路径名转化成字符串file.getPath()-----"+file.getPath());
    File testFile = new File("D:/java");
    File[] listFiles = testFile.listFiles();
    for(File list : listFiles) {
      System.out.println("文件名:"+list.getName()+""+"----是否目录:"+list.isDirectory()+"----是否文件:"+list.isFile()+"-----绝对路径:"+list.getAbsolutePath());
    }
  }
  /**
   * 创建文件,前提是要在已有的目录下面
   */
  private static void testCreateFile() throws IOException, URISyntaxException {
    //******createNewFile()*********
    //在已有目录D:/java下面创建文件test.txt.
    File javaDir = new File("D:/java");//先创建D:/java目录.
    javaDir.mkdir();
    //方式1:
    File file1 = new File("D:/java/test.txt");
    file1.createNewFile();
    //方式2:
    File file2 = new File("D:/java","test.txt");
    file2.createNewFile();
    //方式3:
    File javaFile = new File("D:/java");
    File File3 = new File(javaFile,"test.txt");
    File3.createNewFile();
    //方式4:
    URI uri = new URI("file:/D:/java/home");
    File file4 = new File(uri);
    file4.createNewFile();
  }
  
  /**
   * 创建目录方法共两类:
   * 1.mkdir()方法,要求父级的目录必须是存在的
   * 2.mkdirs()方法,父级目录可以不存在
   */
  private static void testCreateDirectory() throws URISyntaxException {
    //*******mkdir()********
    //1.在已有D:/java目录下面创建home目录
    File javaDir = new File("D:/java");
    javaDir.mkdir(); //创建D:/java,使得D盘根目录下面java目录已存在.
    //方式1:
    File file1 = new File("D:/java/home");
    file1.mkdir();
    //方式2:
    File file2 = new File("D:/java","home");
    file2.mkdir();
    //方式3:
    URI uri = new URI("file:/D:/java/home");
    File file3 = new File(uri);
    file3.mkdir();
    
    //******mkDirs()********
    //2.父级别目录不存在,即D:/java目录不存在,创建多级目录,D:/java/home.
    //方式1:
    File dirsFile1 = new File("D:/java/home");
    dirsFile1.mkdirs();
    //方式2:
    File dirsFile2 = new File("D:/java","home");
    dirsFile2.mkdirs();
    //方式3:
    URI dirsUri = new URI("file:/D:/java/home");
    File dirsFile3 = new File(dirsUri);
    dirsFile3.mkdirs();
    //方法4:
    File javaDir1 = new File("D:/java");
    File file4 = new File(javaDir1,"home");
    file4.mkdirs();
  }
}
//testOtherMethod方法运行结果
文件是否存在file.exists-----true
文件绝对路径file.getgetAbsolutePath()------D:\java\test.txt
文件名file.getName()-----test.txt
file.getParentFile()------D:\java
父级目录路径名file.getParent()-----D:\java
uri的路径file.toURI()------file:/D:/java/test.txt
最后修改时间file.getLastModified()-----1536546025013
路径名转化成字符串file.getPath()-----D:\java\test.txt
文件名:test.txt----是否目录:false----是否文件:true-----绝对路径:D:\java\test.txt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值