1. 程式人生 > >Java IO流筆記4 --- File類

Java IO流筆記4 --- File類

1 概述

IO流,流物件,只能操作裝置上的資料,其他的都操作不了。 資料夾,檔案的屬性(檔案的建立,修改,讀寫屬性,檔名等),這些需要用 File類來操作。

File類

用來將檔案或者資料夾(目錄) 封裝成物件

檔案一旦變為物件,可以先操作檔案,再操作檔案中的資料

方便對檔案或者資料夾的屬性資訊進行操作 File物件可以作為引數,傳遞給流的建構函式

檔案一旦變為物件,可以先操作檔案,再操作檔案中的資料,可以將一個已存在的,或者不存在的 檔案或者目錄 封裝成file物件

幾個建構函式 File(String pathname) 通過 將給定路徑 名字字串 轉換為抽象路徑名  來建立一個 新File例項 例:File f1 = new File("c:\\a.txt");

// 想把誰封裝成物件,把誰往裡寫就可以了

File(String parent, String child) File(File parent, String child) 根據 parent路徑名 字串 和 child路徑名 字串,建立一個 新File例項 例:File f2 = new File("c:\\","a.txt"); File( URI uri ) 通過 將給定的 file: URI 轉換為一個 抽象路徑名 來建立一個 新的File例項

File類的功能主要分為4種:獲取,建立與刪除,判斷,重新命名,過濾器,下面分別講解

2 獲取

2.1 獲取 File類 本身的屬性

獲取 File類 本身的屬性,包括,獲取檔名稱,檔案路徑,檔案大小,檔案修改時間等

File f = new File("G:\\test\\GestureTest\\a.txt");
String name = f.getName();
String absPath = f.getAbsolutePath(); // 絕對路徑
String path = f.getPath();
long len = f.length(); // 檔案的大小
long time = f.lastModified(); // 檔案上次的修改時間
// 打印出來的時間是 1336102144203 怎麼把它變為有效的時間
Date date = new Date(time); // 先把時間封裝
// 把時間 格式化
DateFormat dateFormate =
DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG); String str_time = dateFormate.format(date); // 怎麼判斷檔案有沒有被改寫,判斷檔案上次修改時間 // 單獨開闢一條執行緒,監控檔案的修改時間,一旦檔案修改,就重新讀取檔案的內容 System.out.println("parent:"+ f.getParent()); // getParent() 獲取父目錄 System.out.println("name:"+name); System.out.println("absPath:"+absPath); System.out.println("path:"+path); System.out.println("len:"+len); System.out.println("time:"+time);

輸出結果

parent:G:\test\GestureTest
name:a.txt
absPath:G:\test\GestureTest\a.txt
path:G:\test\GestureTest\a.txt
len:35
time:1537322126301
2.2 獲取系統根目錄和容量

static File listRoots() 列出可用的檔案系統根

private static void getListRoots() {
		File[] files = File.listRoots();
		for(File file:files){
			 System.out.println(file); // 這個列印電腦根目錄 C:\   D:\  E:\  F:\  G:\
		}
		File file = new File("G:\\");
		System.out.println("getFreeSpace:"+file.getFreeSpace()); // 常用
		System.out.println("getTotalSpace:"+file.getTotalSpace());
		System.out.println("getUsableSpace:"+file.getUsableSpace());	
	}

輸出結果:

C:\
D:\
E:\
F:\
G:\
getFreeSpace:32711270400
getTotalSpace:161060220928
getUsableSpace:32711270400
2.3 獲取指定目錄全部檔案

如果現在給出了一個目錄,則可以直接列出目錄中的內容。列出的方法在File類中存在兩個:

  • 以字串陣列的形式返回:public String[] list()
  • 以File陣列的形式返回:public File[] listFiles()

分別演示如下: public String[] list() ,以字串陣列的形式返回,列出了全部的名字,包括資料夾得名字和檔案的名字

private static void getList() {
		File f = new File("G:"+ File.separator);
		String[] str = f.list();
		for(String s:str){
			System.out.println(s);
		}
}

輸出結果:

$RECYCLE.BIN
a
app
cpcopy
demo
exerise
JAVA
Javaex
JAVA視訊
jdk
jing
Jlex
... ...

public File[] listFiles(),以File陣列的形式返回,列出了全部路徑

private static void getlistFiles() {
		File f = new File("G:"+File.separator);
		File[] files = f.listFiles();
		for(File file:files){
			System.out.println(file);
		}	
	}

輸出結果:

G:\$RECYCLE.BIN
G:\a
G:\app
G:\cpcopy
G:\demo
G:\exerise
G:\JAVA
... ... 

3 建立與刪除

檔案的建立與刪除,方法的返回型別是 boolean型別

//	檔案的建立和刪除
File file = new File("file.txt");
// 和輸出流不一樣,如果檔案不存在,則建立,如果檔案存在,則不建立
boolean b = file.createNewFile();	
System.out.println("b="+b);
boolean b = file.delete();
System.out.println("b="+b);

// 資料夾的建立與刪除
File dir = new File("abc\\q\\e\\c\\z\\r\\w\\y\\f\\e\\g\\s"); //建立多級目錄
boolean b = dir.mkdir();//make directory		// 建立單級目錄
dir.mkdirs();          //建立多級目錄
System.out.println(dir.delete());  // 資料夾的刪除
System.out.println(dir.delete());  // 資料夾的刪除

說明:
windows的刪除是從裡往外刪的,如果資料夾裡有內容,直接刪除,是刪不掉的
如果資料夾裡沒有內容,直接刪可以刪掉
 對於多級目錄,使用 delete()方法,返回true,最裡面的 s 被刪除掉
 如果檔案正在被流所操作,同樣也是刪不掉

4 判斷

我們若想操作一個檔案,就要先判斷這個檔案存不存在

File f = new File("a.txt");
boolean b = f.exists();
System.out.println("b="+b);  // --- 判斷一個檔案是否存在的程式碼

File f = new File("aaa");
f.mkdir(); // 執行完這句,建立一個名為 aaa.txt的資料夾

File f = new File("aaa");
f.createNewFile(); // 建立一個檔案

 aaa不一定是目錄,a.txt 也不一定是檔案
 所以如果檔案未知,在操作前,先判斷一下是否存在
 
 File f=new File("d:"+File.separator+"test.txt");
       if(f.exists()){
	      // 進行操作
        }else{
             try {
		     f.createNewFile(); // 不存在,就建立檔案
	      } catch (IOException e) {
		     e.printStackTrace();
	      }
  }
}

5 重新命名

如果在同一個目錄下,是重新命名,如果不在同一目錄下,是剪下

public static void renameToDemo() {
		File f1 = new File("c:\\9.mp3");
		File f2 = new File("d:\\aa.mp3");
		boolean b = f1.renameTo(f2);
		System.out.println("b="+b);
	 }

6 過濾器

常用方法

String[] list( FilenameFilter filter ) 返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中,滿足指定過濾器的檔案和目錄 FilenameFilter --- 介面

原理

過濾器,第一步做的,還是先呼叫 list,把這個 list下,所有目錄都拿到,然後遍歷陣列,只要符合自己建立的 FilenameFilter.accept(dir, name);,只要返回true,就把符合條件的 內容 往數組裡存

程式碼例項1

// 過濾器 --- 找發非隱藏檔案
public class FilterByHidden implements FileFilter {
	public boolean accept(File pathname) {
		return !pathname.isHidden();
	}
}

private static void hiddenFile() {
		File f = new File("C:\\");
		File[] files = f.listFiles(new FilterByHidden());
		
		for(File file: files){
			System.out.println(file);
		}
	}

輸出結果

C:\AppData
C:\BluetoothExchangeFolder
C:\dlcache
C:\Documents and Settings
C:\inetpub
C:\Intel
C:\MiFlashvcom.ini
C:\PerfLogs
C:\Program Files
C:\Program Files (x86)
C:\SWSETUP
C:\unintall.log
C:\Users
C:\WiFi_Log.txt
C:\Windows

程式碼例項2 專門用於過濾字尾名的過濾器

public class SuffixFilte implements FilenameFilter {

	private String suffix ;  // 我要過濾什麼,不知道,你傳什麼,我過濾什麼 
	public SuffixFilte(String suffix) {
		super();
		this.suffix = suffix;
	}
	public boolean accept(File dir, String name) {
		return name.endsWith(suffix);
	}
}


private static void txtFile() {
		File f = new File("C:\\");
		File[] files = f.listFiles(new SuffixFilte(".txt"));
		
		for(File file: files){
			System.out.println(file);
		}
	}

輸出結果:

C:\WiFi_Log.txt