Java - IO - File類

File類

java.io.File類,文件和目錄路徑名的抽象表示形式。java

Java把電腦中的文件和目錄封裝成一個File類,讓咱們能夠經過File類進行文件操做。linux

關鍵詞:file、directory、path數組

路徑path

  • 絕對路徑:是一個完整的路徑ide

    • 以盤符(C: D:)開始的路徑
      • D:\IdeaProjects\IO操做\test.txt
  • 相對路徑:是一個簡化的路徑函數

    • 相對是指相對於當前項目的根目錄
    • D:\IdeaProjects\IO操做\test.txt --> 簡化: test.txt
    • 默認到根目錄下尋找

注意:優化

  • 路徑是不分大小寫的this

  • window系統下,文件名分隔符用反斜槓\ ,與轉義符號衝突,須要用兩個反斜槓\\表示一個普通的反斜槓\操作系統

  • D:\\IdeaProjects\\IO操做\\test.txtcode

靜態變量

Modifier and Type Field and Description
static String pathSeparator 與系統相關的路徑分隔符字符,爲方便起見,表示爲字符串。
static char pathSeparatorChar 與系統相關的路徑分隔符。
static String separator 與系統相關的默認名稱 - 分隔符字符,以方便的方式表示爲字符串。
static char separatorChar 與系統相關的默認名稱分隔符。
package file;

import java.io.File;

public class TestFile {
    public static void main(String[] args) {
        /*
            File 類的有關靜態變量
            pathSeparator 路徑分割符,不如在裝jdk環境變量時,不一樣路徑用分號隔開
            window用分號;      linux用冒號:
            separator 文件名稱分割符
            window用反斜槓\    linux用正斜杆/
            
         */

        // 原始的是char型
        System.out.println(File.pathSeparatorChar);
        System.out.println(File.separatorChar);
        // ""+原始 獲得字符串型
        System.out.println(File.pathSeparator);
        System.out.println(File.separator);

    }
}

可知不一樣的操做系統路徑表示是不同的,將來的開發中,爲了兼容不一樣系統,應該先獲取separator再拼接路勁,不能把路徑寫死!component

構造方法

Constructor and Description
File(File parent, String child) 從父抽象路徑名和子路徑名字符串建立新的 File實例。
File(String pathname) 經過將給定的路徑名字符串轉換爲抽象路徑名來建立新的 File實例。
File(String parent, String child) 從父路徑名字符串和子路徑名字符串建立新的 File實例。
File(URI uri) 經過將給定的 file: URI轉換爲抽象路徑名來建立新的 File實例。

參數pathname:字符串的路徑名稱

路徑能夠以文件結尾,也能夠是文件夾結尾

路徑能夠是相對路徑,也能夠是絕對路徑

路徑能夠是存在的,也能夠不存在!

建立File對象,只是把字符串路徑封裝成File對象,不考慮路徑的真假。

經常使用方法

判斷功能

  • public boolean exists() 此File表示的文件或目錄是否存在。
  • public boolean isDirectory() 此File表示的文件是否爲目錄。
  • public boolean isFile() 此File表示的文件是否爲普通文件。

建立刪除功能

  • public boolean createNewFile() 當且僅當具備該名稱的文件尚不存在時,建立一個File空文件
  • public boolean delete() 刪除由此File表示的文件/目錄。
  • public boolean mkdir() 建立由此File表示的目錄。(單級)
  • public boolean mkdirs() 建立由此File表示的目錄,包括任何須需但不存在的父目錄。(可多級)

獲取功能

  • public String getAbsolutePath() 返回此File的絕對路徑名字符串。
  • public String getPath() 將此File轉換爲路徑名字符串。
  • public String getName() 返回由此File表示的文件或目錄的名稱。
  • public long length() 返回由此File表示的文件的長度。

目錄的遍歷

  • public String[] list() 返回一個String數組,表示該File目錄中的全部子文件/目錄
  • public File[] listFiles() 返回一個File數組,表示該File目錄中的全部子文件/目錄的抽象File
package file;

import java.io.File;

/**
 * 經過遞歸打印多級目錄
 */
public class DirectoryTraversal {
    public static void main(String[] args) {
        File file = new File("aaa");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        System.out.println(dir.getAbsolutePath());
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}
文件

文件搜索

在目錄遍歷的基礎上篩選某些類型的文件

package file;

import java.io.File;

/**
 * 經過遞歸打印多級目錄
 * 同時篩選.java文件
 */
public class SearchFile {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操做");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                // 只打印以 .java結尾的文件
                String name = file.getName();
                name = name.toLowerCase();// 不區分大小寫
                if (name.endsWith(".java")) {
                    System.out.println(file.getAbsolutePath());
                }
            } else {
                getAllFile(file);
            }
        }
    }
}

只須要打印以前進行一些判斷便可。

使用過濾器進行搜索

返回值 描述
File[] listFiles(FileFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名錶示的知足指定過濾器的目錄中的文件和目錄。
File[] listFiles(FilenameFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名錶示的知足指定過濾器的目錄中的文件和目錄。

查看官方文檔,FileFilter是一個接口,只定義了一個accept抽象方法,沒有實現類!!須要本身編寫實現類

image-20200518162937825

過濾器實現類

package file;

import java.io.File;
import java.io.FileFilter;

public class FileFilterImpl implements FileFilter {
    // 過濾標識
    private String str;

    public FileFilterImpl() {
        str = ".java";
    }

    public FileFilterImpl(String str) {
        this.str = str;
    }

    @Override
    public boolean accept(File pathname) {
        /*
            過濾以.java結尾的文件
            注意!若是是目錄也須要返回,不然將沒法遞歸遍歷多級目錄
         */
        if (pathname.isDirectory()) {
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(str);
    }
}

優化後的文件搜索

package file;

import java.io.File;

public class SearchFile2 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操做");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 經過過濾器篩選 .class結尾的文件
        File[] files = dir.listFiles(new FileFilterImpl(".class"));
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

解釋

  • 優化後的代碼File[] files = dir.listFiles(new FileFilterImpl(".class"));
  • dir.listFiles首先遍歷dir目錄下的全部子文件或目錄,將它們封裝成File對象
  • 而後調用參數傳遞的過濾器中的accept方法
  • accept的參數pathname就是以前遍歷dir目錄時封裝的每個File對象
  • accept返回true就將File對象添加到File[ ] 數組中,不然不加入。

匿名內部類實現過濾器

package file;

import java.io.File;
import java.io.FileFilter;

/**
 * 使用匿名內部類實現過濾器
 */
public class SearchFile3 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操做");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 經過過濾器篩選 .java結尾的文件
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
            }
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

使用lambda表達式

package file;

import java.io.File;
import java.io.FileFilter;

/**
 * 使用lambda表達式函數式接口
 */
public class SearchFile4 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操做");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 經過過濾器篩選 .java結尾的文件
        File[] files = dir.listFiles((File pathname)->{
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

FilenameFilter也和FlieFilter差很少

注意一下參數的類型便可,dir是根目錄,name是文件名

package java.io;

/**
 * Instances of classes that implement this interface are used to
 * filter filenames. These instances are used to filter directory
 * listings in the <code>list</code> method of class
 * <code>File</code>, and by the Abstract Window Toolkit's file
 * dialog component.
 *
 * @author  Arthur van Hoff
 * @author  Jonathan Payne
 * @see     java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter)
 * @see     java.io.File
 * @see     java.io.File#list(java.io.FilenameFilter)
 * @since   JDK1.0
 */
@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);
}

lambda表示形式

package file;

import java.io.File;

/**
 * 使用lambda表達式函數式接口
 */
public class SearchFile5 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操做");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 經過FilenameFilter過濾器篩選 .java結尾的文件
        File[] files = dir.listFiles((File d, String name)->{
            return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

lambda簡化

File[] files = dir.listFiles(
    pathname->pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")
);
相關文章
相關標籤/搜索