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