1. 程式人生 > >IO流前提——學習File

IO流前提——學習File

File

File(檔案物件)

IO流意味著輸入輸出,就是磁碟檔案、記憶體等其他與程式進行互動(讀資料,寫資料)
常見的如記事本的儲存功能:
在這裡插入圖片描述
點選儲存就是將字元寫到檔案中永久儲存

開發中常見的就是將日誌檔案儲存

File介紹

java中的File類描述的是計算機中的檔案和資料夾
而不只是檔案

  1. 構造方法
public File(File parent,String child) //檔案的抽象路徑名(檔案的路徑+檔名)
public File(String pathname) 
public File(String parent,String child) // parent + child 就是上面的pathname

建立File物件

以下只是抽象路徑的描述,而不是真的在磁碟上建立了一個檔案或者資料夾

File  file1 = new File("C:/test.txt"); //不代表的檔案
File  file2 = new File("C:/xx"); //此處不代表是資料夾

建立檔案

這裡是真正的在計算機上建立了一個檔案
用到的方法 :public boolean createNewFile()throws IOException
Code:

File file1 = new File("C:/test.txt"); 
file1.createNewFile(); //這裡表示在C盤建立了一個test.txt的檔案
File file = new File("C:/xx"); file.createNewFile(); //在C盤下建立了一個xx的檔案,注意:這裡不是資料夾,還是檔案,只是沒有後綴名而已

注意事項:

1.需要File物件呼叫:根據File物件中的pathname來建立檔案
2.如果檔案已經存在,返回false
3.如果檔案路徑不存在,丟擲IO異常
4.此方法只能夠建立檔案,不會建立資料夾

建立資料夾

這裡是真正的在計算機上建立了一個檔案
用到的方法 :
1.public boolean mkdir() //建立目錄,但是不能建立父路徑
2.public boolean mkdirs() //會建立父路徑

具體見程式碼

Code:

File file1 = new File("C:/a"); 
file1.mkdir(); //這裡表示在C盤建立了一個a的資料夾
File file = new File("C:/xx/oo");
file.mkdir(); //此處會報錯,因為c盤中沒有xx的目錄(就是上面說的父路徑)

File file = new File("C:/xx/oo");
file.mkdirs();  //建立成功,會在C盤建立xx,  xx下面建立oo

刪除檔案

不管資料夾還是檔案,都可以呼叫此方法刪除
 **Method:**
public boolean delete()

注意事項:

1.需要File物件來呼叫(把File物件所關聯的檔案從磁碟上面刪除)
2.如果是刪除資料夾,必須是空資料夾
3.檔案就直接刪除
4.希望 : 有一個方法可以直接刪除檔案和資料夾(包括子資料夾和檔案的)

直接刪除檔案和資料夾(包括子資料夾和檔案的)

遞迴刪除

/**
	 * 刪除當前目錄及其下面的目錄和檔案
	 * @param file 刪除承成功返回true,
	 * 如果file==null,返回false,如果file不存在,返回false
	 */
	public static boolean deleteAll(File file) {
		//判斷檔案是否為null
		if (file == null)
			return false;
		if (!file.exists())
			return false;
		if (file.isFile())
			file.delete();
		if (file.isDirectory()) {
			//得到資料夾所有的檔案
			File[] listFiles = file.listFiles();
			for (File file2 : listFiles) {
				deleteAll(file2);
			}
		}
		
		return file.delete();
	}

File基本方法及應用

public boolean isDirectory()  //判斷是否是一個目錄
public boolean isFile() 	//判斷是否是一個檔案
public boolean exists()  //測試此抽象路徑名錶示的檔案或目錄是否存在 

public static File[] listRoots() // 列出可用的檔案系統根(作業系統上面的碟符)
作用: 先判斷電腦上有哪些碟符,然後在制定的位置建立資料夾或者檔案
public String[] list() //返回當前的資料夾物件下面一層的所有的檔案(資料夾)的名字
public File[] listFiles() //返回當前的資料夾物件下面一層的所有的檔案(資料夾)(File物件的形式)
其他請查API

Code:

public static void main(String[] args) {
		File file = new File("C:\\Users\\maple\\Desktop\\itsourcejava\\xx\\oo");
		List<File> fileFilter = fileFilter(file, "txt");
		System.out.println(fileFilter);
	}
	
	/**
	 * 返回當前目錄下過濾後的檔案
	 * @param file 抽象路徑
	 * @param suffix 字尾名(什麼格式的)
	 */
	public static List<File> fileFilter(File file, String suffix) {
		if (file == null)
			return null;
		if (!file.exists())
			return null;
//		 *1.獲取到當前目錄下的所有file物件 
		File[] listFiles = file.listFiles();
		//獲取到的有可能為null
		if (listFiles == null)
			return null;
		//如果不是null
		//判斷是否是空目錄
		if (listFiles.length <= 0)
			return null;
		List<File> list = new ArrayList<>();
//		 *2.判斷是不是檔案,檔案才有字尾名
		for (File fi : listFiles) {
			if (fi.isFile()) {
//		 *3.判斷是不是以suffix結尾的,如果是加入到集合中
				if (fi.getName().endsWith("."+suffix))
					list.add(fi);
			}
		}
		
		return list;
		
	}


列出隱藏檔案

	/**
	 * 列出所有隱藏檔案
	 * @param file 抽象路徑
	 */
	public static List<File> listHiddenFiles(File file) {
		if (file == null)
			return null;
		if (!file.exists())
			return null;
		//*1.獲取到當前目錄下的所有file物件 
		File[] listFiles = file.listFiles();
		//獲取到的有可能為null
		if (listFiles == null)
			return null;
		//如果不是null
		//判斷是否是空目錄
		if (listFiles.length <= 0)
			return null;
		
		List<File> list = new ArrayList<>();
//		 *2.判斷是不是檔案
		for (File fi : listFiles) {
			if (fi.isFile()) {
//		 *3.判斷是否是隱藏檔案
				if (fi.isHidden()) {
					list.add(fi);
				}
			}
		}
		
		return list;
	}

檔名和檔案過濾器

呼叫的時候指定具體的過濾器來得到我們想要的一個目錄下面的東西
過濾器的介面(FilenameFilter,  FileFilter)
具體實現需要自己繼承介面覆寫方法
**Method:**
String[] list(FilenameFilter filter) 
File[] listFiles(FileFilter filter)  
File[] listFiles(FilenameFilter filter)
**Code:**
我這裡採用的是匿名內部類,就沒有再寫一個類去實現了
public static void main(String[] args) {
		File file = new File("C:\\Users\\maple\\Desktop\\itsourcejava\\xx\\oo");
		//返回所有過濾的檔名
		String[] list = file.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				//判斷檔名是否是以.txt結尾的
				return name.endsWith(".txt");
			}
		});
		System.out.println(Arrays.toString(list));
	}