Java:IO流之: File類使用總結
前言-------
學了IO流的一些操作,去年學習C++的I/O流的經驗告訴我, I/O流的知識特別容易遺忘, 還好我養成了寫部落格的習慣,不然一兩週過後就忘了...
注:轉載請註明來源
目錄
三.正確區分mkdir(),mkdirs(),creatNewFile()
一.什麼是File類,有什麼作用
Java檔案類以抽象的方式代表檔名和目錄路徑名。該類主要用於檔案和目錄的建立、檔案的查詢和檔案的刪除等.
我覺得用C/C++中的檔案指標來理解反而比較容易,就是把FIle類類別成一個檔案指標,達到操作某個檔案的作用(在Java裡面用引用的概念理解也是可以的)
二.使用絕對路徑或者相對路徑建立File物件
File類的建構函式有多個,但是我們一般使用 File(String pathname)來建立, 也就是傳檔案的絕對路徑或者相對路徑來建立.
絕對路徑:一個檔案或者資料夾的完整路徑
相對路徑:以當前Java檔案所在的專案資料夾為根目錄
三.正確區分mkdir(),mkdirs(),creatNewFile()
- 區分一下檔案和資料夾:
檔案就是.txt, .doc .java .cpp等字尾的檔案, 不可能有子檔案了;而資料夾可以有子檔案
- 理解public boolean mkdir():
建立資料夾,不會建立檔案
如果該資料夾存在就不建立了(呼叫file.mkdir()就會返回false)
如果該資料夾的父路徑存在,那麼就會建立
一級建立: D:/aa/bb/cc/dd/ee: 當D:/aa/bb/cc/dd 存在時ee才會被建立
測試程式碼1:當D:/aa/bb存在時,可以成功建立cc.txt
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc.txt");
if(!f.exists())
f.mkdir();
}
}
截圖如下:建立成功
大家還有沒有奇怪的地方, 就是為啥建立的不是記事本檔案呢?哈哈哈,這就是我上面提到的mkdir()只能建立資料夾,所以就建立了個名字為"cc.txt"的資料夾
測試程式碼2: D:/aa/bb/存在,但是D:/aa/bb/xx不存在時,是無法成功建立cc.txt的
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/xx/cc.txt");
if(!f.exists())
f.mkdir();
}
}
截圖如下:建立不成功
- 理解public boolean mkdirs():
建立資料夾,不會建立檔案
如果該資料夾存在就不建立了(呼叫file.mkdirs()就會返回false)
如果資料夾不存在,會幫你補全父目錄,再建立, 說白了就是可以多級建立
多級建立: D:/aa/bb/cc/dd/ee, 就算D:/aa/bb/cc/dd 沒有完整地存在, 它也會自動幫你補全路徑,再建立ee
測試程式碼: D:/aa/bb原先就存在,但是D:/aa/bb/cc/dd不存在,但是可以自動補全路徑,再建立ee
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc/dd/ee");
if(!f.exists())
f.mkdirs();
}
}
截圖如下:成功建立ee
綜上:mkdirs()是萬金油啊,好用,我一般都用mkdirs()
- 理解creatNewFile()
建立的是檔案,不是資料夾
如果檔案存在就會不建立
如果父路徑不存在,那麼不會建立,而且會丟擲異常
如果父路徑存在,但該檔案不存在,會建立
測試程式碼:
package Test;
import java.io.File;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc/dd/ee.txt");
if(!f.exists()) {
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
當D:/aa/bb存在, D:/aa/bb/cc/dd不存在,是無法建立ee.txt的
當D:/aa/bb/cc/dd存在,是可以成功建立ee.txt的
四.如何做到檔案不存在時自動建立 (我的模板超級好用)
大家知道,每次都事先建立一個已經存在的資料夾,有時有點麻煩,畢竟人總是懶惰的. 我自己設計了一個小模板,巨好用,無論父路徑是否完整存在,無論目標檔案是否存在 ,都可以通吃,巨好用的模板,強烈推薦!
首先介紹一個方法:public File getParentFile()
返回此路徑的父路徑,如果此路徑沒有指定父路徑,則返回 null
。
模板程式碼1:(建立檔案)
public void checkFile(File f) {
//判斷檔案是否存在
if(!f.exists()) {
//不管父路徑完整不完整,先用mkdirs()補全父目錄
f.getParentFile().mkdirs();
}
//不管目標檔案是否存在,都用creatNeaFile()建立
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
}
模板程式碼2:(建立資料夾)
public void checkFile(File f) {
if(!f.exists()) {
f..mkdirs();
}
}
注:每當我們FIle f = new File(" 路徑")後,我們只要再使用一次checkFile()來保證對應的檔案或者資料夾被自動建立就可以了,從而避免總是先要建立一個檔案
五.一些常用方法的demo
1 | public String getName() 返回由此抽象路徑名錶示的檔案或目錄的名稱。 |
2 | public String getParent()、 返回此抽象路徑名的父路徑名的路徑名字串,如果此路徑名沒有指定父目錄,則返回 null 。 |
3 | public File getParentFile() 返回此抽象路徑名的父路徑名的抽象路徑名,如果此路徑名沒有指定父目錄,則返回 null 。 |
4 | public String getPath() 將此抽象路徑名轉換為一個路徑名字串。 |
5 | public boolean isAbsolute() 測試此抽象路徑名是否為絕對路徑名。 |
6 | public String getAbsolutePath() 返回抽象路徑名的絕對路徑名字串。 |
7 | public boolean canRead() 測試應用程式是否可以讀取此抽象路徑名錶示的檔案。 |
8 | public boolean canWrite() 測試應用程式是否可以修改此抽象路徑名錶示的檔案。 |
9 | public boolean exists() 測試此抽象路徑名錶示的檔案或目錄是否存在。 |
10 | public boolean isDirectory() 測試此抽象路徑名錶示的檔案是否是一個目錄。 |
11 | public boolean isFile() 測試此抽象路徑名錶示的檔案是否是一個標準檔案。 |
12 | public long lastModified() 返回此抽象路徑名錶示的檔案最後一次被修改的時間。 |
13 | public long length() 返回由此抽象路徑名錶示的檔案的長度。 |
14 | public boolean createNewFile() throws IOException 當且僅當不存在具有此抽象路徑名指定的名稱的檔案時,原子地建立由此抽象路徑名指定的一個新的空檔案。 |
15 | public boolean delete() 刪除此抽象路徑名錶示的檔案或目錄。 |
16 | public void deleteOnExit() 在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄。 |
17 | public String[] list() 返回由此抽象路徑名所表示的目錄中的檔案和目錄的名稱所組成字串陣列。 |
18 | public String[] list(FilenameFilter filter) 返回由包含在目錄中的檔案和目錄的名稱所組成的字串陣列,這一目錄是通過滿足指定過濾器的抽象路徑名來表示的。 |
19 | public File[] listFiles() 返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名所表示目錄中的檔案。 |
20 | public File[] listFiles(FileFilter filter) 返回表示此抽象路徑名所表示目錄中的檔案和目錄的抽象路徑名陣列,這些路徑名滿足特定過濾器。 |
21 | public boolean mkdir() 建立此抽象路徑名指定的目錄。 |
22 | public boolean mkdirs() 建立此抽象路徑名指定的目錄,包括建立必需但不存在的父目錄。 |
23 | public boolean renameTo(File dest) 重新命名此抽象路徑名錶示的檔案。 |
24 | public boolean setLastModified(long time) 設定由此抽象路徑名所指定的檔案或目錄的最後一次修改時間。 |
25 | public boolean setReadOnly() 標記此抽象路徑名指定的檔案或目錄,以便只可對其進行讀操作。 |
26 | public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目錄中建立一個新的空檔案,使用給定的字首和字尾字串生成其名稱。 |
27 | public static File createTempFile(String prefix, String suffix) throws IOException 在預設臨時檔案目錄中建立一個空檔案,使用給定字首和字尾生成其名稱。 |
28 | public int compareTo(File pathname) 按字母順序比較兩個抽象路徑名。 |
29 | public int compareTo(Object o) 按字母順序比較抽象路徑名與給定物件。 |
30 | public boolean equals(Object obj) 測試此抽象路徑名與給定物件是否相等。 |
31 | public String toString() 返回此抽象路徑名的路徑名字串。 |
一些方法的demo:
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileObjectTest myTest = new FileObjectTest();
myTest.fileTest1();
}
public void checkFile(File f) {
if(!f.exists()) {
f.getParentFile().mkdirs();
}
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
if(!f.exists()) {
f.mkdirs();
}
}
public void fileTest1() {
//引數為絕對地址
File t1 = new File("D:/data1.txt");
//自動建立
checkFile(t1);
//判斷操作的檔案是否存在
System.out.println(t1.exists() ==true? "檔案存在":"檔案不存在");
//返回該檔案的絕對地址
System.out.println(t1.getAbsolutePath());
//引數為相對地址
File t2 = new File("data2.txt");
//自動建立
checkFile(t2);
//判斷操作的檔案是否存在
System.out.println(t2.exists() == true? "檔案存在":"檔案不存在");
//返回該檔案的絕對地址
System.out.println(t2.getAbsolutePath());
//返回該檔案定義時的地址
System.out.println(t2.getPath());
//判斷是否是資料夾
System.out.println("t2:" + t2.isDirectory());
System.out.println("t1:" + t1.isDirectory());
//判斷檔案長度
System.out.println("t2:" + t2.length());
System.out.println("t1:" + t1.length());
//獲取檔案最後修改時間
long time = t1.lastModified();
Date temp = new Date(time);
System.out.println("t1 最後的修改日期為:" + temp);
time = t2.lastModified();
temp = new Date(time);
System.out.println("t2 最後的修改日期為:" + temp);
//設定檔案的修改時間
t1.setLastModified(0);
time= t1.lastModified();
temp = new Date(time);
System.out.println("t1 最後的修改日期為:" + temp);
//對檔案重新命名
t2.renameTo(t1);
System.out.println(t1.getName());
// 以字串陣列的形式,返回t1資料夾下的所有檔案(不包含子檔案及子資料夾)
String [] myList = t1.list();
for(String temp1 : myList) {
System.out.println(temp1);
}
//以File陣列的形式,返回t1下的所有檔案(不包括子檔案的檔案)
File [] myFiles = t1.listFiles();
for(File temp1 : myFiles) {
temp1.getName();
}
//以資料夾的形式獲取t1檔案所在的資料夾
File father = t1.getParentFile();
System.out.println(father.getName());
//刪除檔案
t1.delete();
t2.delete();
}
}