­

知識點——初識java中File類

  • 2020 年 3 月 18 日
  • 筆記

1.1 什麼是File類

SUN公司提供給開發者操作文件和文件夾的一個類對象。 Java中萬物皆對象,電腦中萬物皆文件

獲取File類有三種方式【Constructor 構造方法】 File(String pathName); 根據對應的文件路徑創建獲取對應的File類對象,可以是文件,可以是文件夾。

File(String parent, String child); 根據對應的父目錄文件夾路徑,以及子文件名或者子文件夾名,創建對應的File類對象

File(File parent, String child); 根據對應的父目錄文件夾File類對象,以及子文件名或者子文件夾名,創建對應File類對象

路徑: 相對路徑 . 當前工作目錄 … 父目錄/上級目錄 正對於當前工作目錄和其他文件或者文件夾之間的最小路徑

絕對路徑 唯一的路徑。 Windows作業系統 C D E F… 每一個盤符都是一個根目錄開始 C:/Windows/System32 Linux UNIX macOS 存在一個 / 目錄文件 /user/liuxiaolei/appliction

路徑有一個很重要的東西 路徑分隔符 Windows 分隔符 默認是 Linux UNIX macOS 分隔符 默認是 /

Windows是支援Linux分隔符 / 沒有任何問題

根據當前系統來區分不同的分隔符 File.separatorChar

程式碼演示:

import java.io.File;    /*   * 創建File類對象   */  public class Demo1 {  	public static void main(String[] args) {  		/*  		 * 1. 路徑分隔符 \ or / or File.separator  		 * 2. 操作文件必須帶有文件的後綴名 1.txt 2.java ...  		 */  		File file = new File("C:\aaa");  		File file1 = new File("C:" + File.separator + "aaa");  		File file2 = new File("C:/aaa", "1.txt");  		File file3 = new File(file, "bbb");    	}  }

1.2 創建文件和文件夾

boolean createNewFile(); 通過File類對象調用,創建對應File類對象中保存的路徑的普通文件。 創建成功返回true,創建失敗返回false 返回false的原因: 1. 路徑不合法。 2. 對應的文件夾沒有寫入許可權。 rwxr-xr-x 3. 對應當前的文件已經存在。

boolean mkdir(); 通過File類對象調用,創建對應File類對象中保存路徑的文件夾 創建成功返回true,創建失敗返回false 返回false的原因 1. 路徑不合法。 2. 對應的文件夾沒有寫入許可權。 3. 對應當前的文件夾已經存在。

boolean mkdirs(); 通過File類對象創建其中保存的文件目錄的所有對應文件夾,包括中間路徑 如果創建失敗,返回false

boolean renameTo(File dest); 通過File類對象調用,轉為目標File類對象dest 文件/文件夾移動,重命名

1.3 刪除文件或者文件夾

boolean delete(); 通過File類對象調用,刪除對應的文件或者文件夾 【要求】 1. 刪除的文件或者文件夾都是直接抹掉數據,不是放入回收站 2. 無法刪除非空文件夾,文件夾中存在其他內容無法整體刪除。

void deleteOnExit(); 程式退出時刪除對應的文件或者文件夾 用於刪除程式運行過程中,留下的日誌文件,緩衝文件,操作日誌…

1.4 文件屬性判斷[有用]

boolean isFile(); 判斷是否是一個普通文件

boolean isDirctory(); 判斷是否是一個文件夾

boolean isAbsolute(); 判斷是否使用了絕對路徑

boolean isHidden(); 判斷是否是隱藏文件

boolean exists(); 判斷文件是否存在

1.5 獲取文件屬性

用處不大的方法 下面的方法和文件是否存在沒有一分錢關係,都可以使用字元串操作直接得到我們想要的結果 String getPath(); 獲取File類對象保存的路徑 String getName(); 獲取當前File類對象中保存的文件名或者文件夾名 String getParent(); 獲取當前File類對象對應文件或者文件夾的父目錄路徑 String getAbsolutePath(); 獲取當File類對象對應文件或者文件夾的絕對路徑

有用方法: long lastModified() 獲取文件的最後一次修改時間,返回值是一個時間戳類型。 從1970年01月01日 00:00:00到現在的秒數。電腦元年

long length(); 獲取文件的大小,佔用硬碟空間位元組數。 如果操作的是文件夾,返回0L

1.6 列表方法

static File[] listRoots(); 通過File類調用,有且針對於Windows作業系統有效,獲取當前電腦內所有根盤符對象,如果是Linux,UNIX,macOS是無效的。

File[] listFiles(); 通過File類對象調用,獲取當前File類對象對應文件夾下的所有子文件或者子文件夾的File類對象數組

String[] list(); 通過File類對象調用,獲取當前File類對象對應文件夾下的所有子文件或者子文件夾的String類型文件名或者文件夾名字數組

1.7 FilenameFilter文件名過濾器

interface FilenameFilter boolean accept(File dir, String name);

源碼展示

@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);  }

程式碼實現:

import java.io.File;  import java.io.FilenameFilter;    /*   * FilenameFilter過濾器演示   */  public class Demo8 {  	public static void main(String[] args) {  		File file = new File("C:\aaa\ddd");    		// 使用匿名內部類的匿名對象直接作為方法的參數  		File[] listFiles = file.listFiles(new FilenameFilter() {    			@Override  			public boolean accept(File dir, String name) {  				/*  				 * dir是當前操作的文件夾類對象  				 * name是當前文件夾下的子文件或者子文件夾名字  				 *  				 * 獲取對應的java文件  				 * 		1. 判斷是不是普通文件  				 * 		2. 判斷當前文件名是不是.java結尾  				 */    				return new File(dir, name).isFile()  						// endsWith字元串方法,判斷當前字元串是不是已指定要求結尾  						&& name.endsWith(".java");  			}  		});    		// Lambda表達式 JDK1.8新特徵  		File[] listFile = file.listFiles((dir, name) ->  			new File(dir, name).isFile()  			&& name.endsWith(".java")  		);    		for (File file2 : listFile) {    			System.out.println(file2.getName());  		}    	}  }

2. 字元串小問題

String str = "孜然肉片";  str += "麻辣香鍋";  str += "番茄雞蛋";  str += "土豆牛肉";  str += "烤羊排";  str += "金湯肥牛";  str += "蒜蓉油麥菜";    System.out.println("這裡有幾個字元串");

這裡一共有幾個字元串?

答案: 這裡有14個字元串 使用雙引號包含的字元串都是字元串常量!!!常量的概念中要求不可以修改。 雙引號包含的字元串都是存在於記憶體的【數據區】

+ 在字元串常量操作時,使用原本的兩個字元串拼接之後完成的一個新的字元串常量。

這裡導致的字元串冗餘問題,後期會使用StringBuffer StringBuilder來解決問題。