- File类的理解
 - 常用构造器
 - 常用方法
 - 代码示例
 - 练习
 
File类的理解
1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
2.File类声明在java.io中
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小
   等方法,并没有涉及到写入或读取文件内容的操作如果需要读取或写入文件内容,
   必须使用IO流来完成
4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点”
5.File不能访问文件内容本身
6.想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,
  但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录常用构造器

常用方法




代码示例
package com.atguigu.java;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Date;
 
public class FileTest {
    /*
    1.如何创建File类的实例
          File(String filePath)
          File(String parentPath,String childPath)
    2.
     相对路径:相较于某个路径下,指明的路径
     绝对路径:包含盘符在内的文件或文件目录的路径
    3.路径分隔符
      Windows://
      unix:/
     */
    
    public void test1(){
        //构造器1
        File file1=new File("hello.txt");//相对于当前moudle
        File file2=new File("D:\\workspace_idea1\\JavaSenior\\day08\\he.txt");//绝对路径
        //此时还没有对文件中的内容进行修改等操作
        //还认为是内存中的对象
        System.out.println(file1);
        System.out.println(file2);
        //构造器2
        File file3=new File("D:\\workspace_idea1","JavaSenior");
        System.out.println(file3);
        //构造器3
        File file4=new File(file3,"hi.txt");
        System.out.println(file4);
    }
    /**
     *
     *如下两个方法适用于文件目录:
     * public String[]list():获取指定目录下的所有文件或者文件目录的名称数组
     * public File[] listFiles(): 获取指定目录下的所有文件或者文件目录的File数组
     */
    
    public void test2(){
        File file1=new File("hello.txt");
        File file2=new File("d:\\io\\hi.txt");
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getPath());
        System.out.println(file1.getName());
        System.out.println(file1.getParent());
        System.out.println(file1.length());
        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());
    }
    
    public void test3(){
        File file=new File("D:\\workspace_idea1\\JavaSenior");
        String[] list = file.list();
        for (String s:list){
            System.out.println(s);//输出名字
        }
        System.out.println();
        File[] files = file.listFiles();
        for (File f:files){
            System.out.println(f);//会获得具体路径
        }
    }
    /*
    public boolean renameTo(File dest):把文件重命名为指定的文件路径
        比如: file1.renameTo(file2)为例
             要想保证返回true,需要file1在硬盘中存在,而且file2不能在硬盘中存在
     */
    
    public void test4(){
        File file1=new File("hello.txt");
        File file2=new File("D:\\io\\hi.txt");
        boolean rename = file1.renameTo(file2);
        System.out.println(rename);
    }
    
    public void test6() throws IOException {
        //文件创建
        File file1=new File("hi.txt");
        if (!file1.exists()){
            file1.createNewFile();//文件不存在就创建
            System.out.println("创建成功");
        }else {
            //文件存在就删除
            file1.delete();
            System.out.println("删除成功");
        }
    }
}练习
1.判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
package com.atguigu.exer;
import org.junit.Test;
import java.io.File;
import java.io.FilenameFilter;
 
public class FindJPGFileTest {
  
  public void test1(){
    File srcFile = new File("d:\\code");
    
    String[] fileNames = srcFile.list();
    for(String fileName : fileNames){
      if(fileName.endsWith(".jpg")){
        System.out.println(fileName);
      }
    }
  }
  
  public void test2(){
    File srcFile = new File("d:\\code");
    
    File[] listFiles = srcFile.listFiles();
    for(File file : listFiles){
      if(file.getName().endsWith(".jpg")){
        System.out.println(file.getAbsolutePath());
      }
    }
  }
  /*
   * File类提供了两个文件过滤器方法
   * public String[] list(FilenameFilter filter)
   * public File[] listFiles(FileFilter filter)
   */
  
  public void test3(){
    File srcFile = new File("d:\\code");
    
    File[] subFiles = srcFile.listFiles(new FilenameFilter() {
      
      
      public boolean accept(File dir, String name) {
        return name.endsWith(".jpg");
      }
    });
    
    for(File file : subFiles){
      System.out.println(file.getAbsolutePath());
    }
  }
  
}2.遍历指定目录所有文件名称,包括子文件目录中的文件。
拓展1:并计算指定目录占用空间的大小
拓展2:删除指定文件目录及其下的所有文件
package com.atguigu.exer;
import java.io.File;
 
public class ListFilesTest {
  public static void main(String[] args) {
    // 递归:文件目录
    /** 打印出指定目录所有文件名称,包括子文件目录中的文件 */
    // 1.创建目录对象
    File dir = new File("D:\\BaiduNetdiskDownload\\Java\base\course ");
    // 2.打印目录的子文件
    printSubFile(dir);
  }
  public static void printSubFile(File dir) {
    // 打印目录的子文件
    File[] subfiles = dir.listFiles();
    for (File f : subfiles) {
      if (f.isDirectory()) {// 文件目录
        printSubFile(f);
      } else {// 文件
        System.out.println(f.getAbsolutePath());
      }
    }
  }
  // 方式二:循环实现
  // 列出file目录的下级内容,仅列出一级的话
  // 使用File类的String[] list()比较简单
  public void listSubFiles(File file) {
    if (file.isDirectory()) {
      String[] all = file.list();
      for (String s : all) {
        System.out.println(s);
      }
    } else {
      System.out.println(file + "是文件!");
    }
  }
  // 列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
  // 建议使用File类的File[] listFiles()
  public void listAllSubFiles(File file) {
    if (file.isFile()) {
      System.out.println(file);
    } else {
      File[] all = file.listFiles();
      // 如果all[i]是文件,直接打印
      // 如果all[i]是目录,接着再获取它的下一级
      for (File f : all) {
        listAllSubFiles(f);// 递归调用:自己调用自己就叫递归
      }
    }
  }
  // 拓展1:求指定目录所在空间的大小
  // 求任意一个目录的总大小
  public long getDirectorySize(File file) {
    // file是文件,那么直接返回file.length()
    // file是目录,把它的下一级的所有大小加起来就是它的总大小
    long size = 0;
    if (file.isFile()) {
      size += file.length();
    } else {
      File[] all = file.listFiles();// 获取file的下一级
      // 累加all[i]的大小
      for (File f : all) {
        size += getDirectorySize(f);// f的大小;
      }
    }
    return size;
  }
  // 拓展2:删除指定的目录
  public void deleteDirectory(File file) {
    // 如果file是文件,直接delete
    // 如果file是目录,先把它的下一级干掉,然后删除自己
    if (file.isDirectory()) {
      File[] all = file.listFiles();
      // 循环删除的是file的下一级
      for (File f : all) {// f代表file的每一个下级
        deleteDirectory(f);
      }
    }
    // 删除自己
    file.delete();
  }
}








