File是文件,它還有個(gè)兄弟叫流(Stream)
他們一起叫IO
- 當(dāng)需要把內(nèi)存中的數(shù)據(jù)存儲(chǔ)到持久設(shè)備上的這個(gè)動(dòng)作稱為輸出(寫(xiě))Output操作钮糖。
- 當(dāng)把持久設(shè)備上的數(shù)據(jù)讀取到內(nèi)存中的這個(gè)動(dòng)作稱為輸入(讀)Input操作。
把這種輸入與輸出動(dòng)作稱為IO操作茫叭。
1 File與Stream的關(guān)系
IO也可以稱作File(文件)與Stream(流)会烙。
做個(gè)比喻:
- 水杯和水是什么關(guān)系?水杯是水的容器韭赘,水是水杯的內(nèi)容缩滨。
-
文件是流的容器,流是文件的內(nèi)容泉瞻。
image.png
2 輸入流和輸出流
- 輸入流:如果Java程序得到了數(shù)據(jù)脉漏,就是輸入流
-
輸出流:如果Java程序?qū)ν馓峁┝藬?shù)據(jù),就是輸出流袖牙。
image.png
3 File 類的簡(jiǎn)介
File類是文件和目錄路徑名的抽象表示侧巨,即,Java中把文件或者目錄(文件夾)都封裝成File對(duì)象鞭达。也就是說(shuō)如果我們?nèi)ゲ僮鞔疟P(pán)上的文件司忱,或者文件夾只要找到File類即可,F(xiàn)ile類還可以表示磁盤(pán)畴蹭。
3.1 File可以代表:
1.文件
2.目錄
3.磁盤(pán)
4 File類的構(gòu)造函數(shù)
1.File(File parent,String child):從父類抽象路徑名和子類路徑名 字符串創(chuàng)建新的File實(shí)例坦仍。
2.File(String pathname):通過(guò)將給定的路徑名 字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的File實(shí)例。
3.File(String parent,String child:從父類路徑名 字符串和子類路徑名 字符串創(chuàng)建新的File實(shí)例叨襟。
4.File(URI uri):通過(guò)將給定的file:URI轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的File實(shí)例繁扎。
5 常用的File方法
1.delete():刪除由此抽象路徑名表示的文件或目錄,返回值為:boolean類型糊闽。
2.getAbsoluteFile():返回此抽象路徑名的絕對(duì)形式锻离,返回值為:File類型铺峭。
3.getAbsolutePath():返回此抽象路徑名的絕對(duì)路徑名字符串,返回值為:String類型汽纠。
4.getName():返回由此抽象路徑名表示的文件或目錄的名稱卫键,返回值為:String類型。
5.length():返回由此抽象路徑名表示的文件的大小虱朵、長(zhǎng)度莉炉,返回值為:long類型。
案例:
1:獲取文件信息
public static void main(String[] args) {
//創(chuàng)建文件對(duì)象
File file = new File("FileTest.java");
//獲取文件的絕對(duì)路徑碴犬,即全路徑
String absPath = file.getAbsolutePath();
//File中封裝的路徑是什么獲取到的就是什么絮宁。
String path = file.getPath();
//獲取文件名稱
String filename = file.getName();
//獲取文件大小
long size = file.length();
System.out.println("absPath="+absPath);
System.out.println("path="+path);
System.out.println("filename="+filename);
System.out.println("size="+size);
}
2:文件和目錄操作
public static void main(String[] args) throws IOException {
// 對(duì)文件或者文件加進(jìn)行操作。
File file = new File("d:\\file.txt");
// 創(chuàng)建文件:如果文件不存在服协,創(chuàng)建 返回 true绍昂; 如果文件存在,則不創(chuàng)建 返回 false偿荷; 如果路徑錯(cuò)誤窘游,IOException。
boolean b1 = file.createNewFile();
System.out.println("b1=" + b1);
//-----------刪除文件操作-------注意:不去回收站跳纳。慎用------
boolean b2 = file.delete();
System.out.println("b2="+b2);
//-----------需要判斷文件是否存在------------
boolean b3 = file.exists();
System.out.println("b3="+b3);
//-----------對(duì)目錄操作 創(chuàng)建忍饰,刪除,判斷------------
File dir = new File("d:\\abc\\def");
//mkdir()創(chuàng)建單個(gè)目錄寺庄。//dir.mkdirs();創(chuàng)建多級(jí)目錄
boolean b4 = dir.mkdir();
System.out.println("b4="+b4);
//刪除目錄時(shí)艾蓝,如果目錄中有內(nèi)容,無(wú)法直接刪除斗塘。
boolean b5 = dir.delete();
//只有將目錄中的內(nèi)容都刪除后赢织,保證該目錄為空。這時(shí)這個(gè)目錄才可以刪除馍盟。
System.out.println("b5=" + b5);
//-----------判斷文件敌厘,目錄------------
File f = new File("d:\\java");// 要判斷是否是文件還是目錄,必須先判斷存在朽合。
if(f.exists()) {
System.out.println(f.isFile());
System.out.println(f.isDirectory());
}else{
// f.createNewFile();
// f.mkdirs();
}
}
3:磁盤(pán)操作
public static void main(String[] args) throws IOException {
//獲取當(dāng)前所有的磁盤(pán)
File []disks = File.listRoots();
for (int i = 0; i < disks.length; i++) {
System.out.println("盤(pán)符" + disks[i]);
System.out.println(String.format("%s的容量是%d", disks[i], disks[i].getTotalSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getFreeSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getUsableSpace()
/ 1024 / 1024 / 1024));
}
}
5:實(shí)現(xiàn)dir操作
public static void main(String[] args) throws IOException {
File dir = new File("d:\\tools");
//獲取的是目錄下的當(dāng)前的文件以及文件夾的名稱俱两。
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
//獲取目錄下當(dāng)前文件以及文件對(duì)象,只要拿到了文件對(duì)象曹步,那么就可以獲取其中想要的信息
File[] files = dir.listFiles();
for(File file : files){
System.out.println(file);
}
}
注意:在獲取指定目錄下的文件或者文件夾必須滿足下面兩個(gè)條件
1.指定的目錄必須是存在的
2.指定的必須是目錄宪彩,否則容易引發(fā)返回?cái)?shù)組為null的問(wèn)題,出現(xiàn)NullPointerExcetion讲婚。
6文件過(guò)濾
過(guò)濾器有兩種:
(1)FilenameFilter:通過(guò)文件名過(guò)濾
(2)FileFilter:通過(guò)文件對(duì)象過(guò)濾
顯示d盤(pán)根目錄下的所有java源文件
//定義類實(shí)現(xiàn)文件名稱FilenameFilter過(guò)濾器
static class MyFileNameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".java");
}
}
public static void main(String[] args) throws IOException {
//獲取擴(kuò)展名為.java所有文件
//創(chuàng)建File對(duì)象
File file = new File("d:\\");
//獲取指定擴(kuò)展名的文件,由于要對(duì)所有文件進(jìn)行擴(kuò)展名篩選尿孔,因此調(diào)用方法需要傳遞過(guò)濾器
File[] files = file.listFiles(new MyFileNameFilter());
//遍歷獲取到的所有符合條件的文件
for (File f : files) {
System.out.println(f);
}
}
顯示d盤(pán)目錄下的所有目錄
//定義類實(shí)現(xiàn)文件名稱FilenameFilter過(guò)濾器
static class MyFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
public static void main(String[] args) throws IOException {
//顯示D盤(pán)下的所有目錄
File file = new File("d:\\");
File[] files = file.listFiles(new MyFileFilter());
//遍歷獲取到的所有符合條件的文件
for (File f : files) {
System.out.println(f);
}
}
打印d盤(pán)下所有的文件
public static void main(String[] args) {
File file = new File("d:\\");
getAllFile(file);
}
//獲取指定目錄以及子目錄中的所有的文件
public static void getAllFile(File file) {
File[] files = file.listFiles();
//遍歷當(dāng)前目錄下的所有文件和文件夾
if(files!=null) {
for (File f : files) {
if (f != null) {
//判斷當(dāng)前遍歷到的是否為目錄
if (f.isDirectory()) {
//是目錄,繼續(xù)獲取這個(gè)目錄下的所有文件和文件夾
getAllFile(f);
} else {
//不是目錄,說(shuō)明當(dāng)前f就是文件活合,那么就打印出來(lái)
System.out.println(f);
}
}
}
}
}