File 類 獲取路徑 名字等信息 詳解
Table of Contents
首先 , 看測試代碼 , 分三種路徑對api 獲取情況分析 並總結
package test.file;
import java.io.File;
import java.io.IOException;
public class FileAPITest {
public static File file;
public static void main(String[] args) {
testSimple();
testMix();
testVultr();
}
/***
* 測試正常路徑
* 總結:
* 絕對路徑 與 普通路徑 與權威路徑 一致 但是 權威路徑需要拋出io異常
*
* 獲得文件名 直接getName 獲得單獨文件名稱
*
* 獲得父目錄 兩個方法 都是獲得全部路徑
* 區別是一個返回字符 一個返回文件
* 盤符大小
* 兩個取剩餘字節數
* 一個取總字節數
*
*
*/
public static void testSimple(){
file = new File("D:\\tomcat7\\tes001\\00202\\002.txt");
// D:\tomcat7\tes001\00202\002.txt
System.out.println(file.getAbsolutePath());
try {
//D:\tomcat7\tes001\00202\002.txt
System.out.println(file.getCanonicalPath());
} catch (IOException e1) {
e1.printStackTrace();
}
// D:\tomcat7\tes001\00202\002.txt
System.out.println(file.getPath());
// 002.txt
System.out.println(file.getName());//獲得文件名
//D:\tomcat7\tes001\00202\002.txt
System.out.println(file.getAbsoluteFile());
try {
//D:\tomcat7\tes001\00202\002.txt
System.out.println(file.getCanonicalFile());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲得父目錄
//D:\tomcat7\tes001\00202
System.out.println(file.getParent());
//D:\tomcat7\tes001\00202
System.out.println(file.getParentFile());
/**
*
* 返回此抽象路徑名指定的分區中未分配的字節數。
* 返回的未分配字節數是一個提示,而不是一個保證,只能使用這些字節的一部分。
* 未分配字節數很可能在此調用後立即與實際相符。
* 某些外部 I/O 操作可能使其與實際不符,這些操作包括那些在此虛擬機外部系統上進行的操作。
* ===>此方法不保證對此文件系統的寫操作將成功。
* 分區上的未分配字節數;
* 如果抽象路徑名沒有指定分區,則返回 0L。
* 返回值將小於等於 getTotalSpace() 返回的總文件系統大小。
*/
// 21427404800
System.out.println(file.getFreeSpace());
/***
* 返回此抽象路徑名指定的分區上可用於此虛擬機的字節數。
* 若有可能,此方法將檢查寫權限和其他操作系統限制,
* 因此與 getFreeSpace() 相比,此方法能更準確地估計可實際寫入的新數據數。
* 返回的可用字節數是一個提示,而不是一個保證,只能使用這些字節的一部分。
* 未分配字節數很可能在此調用後立即與實際相符。某些外部 I/O 操作可能使其與實際不符,這些操作包括那些在此虛擬機外部系統上進行的操作。此方法不保證對此文件系統的寫操作將成功。
*
* 分區上的可用字節數;
* 如果抽象路徑名沒有指定分區,則返回 0L。
*
*
* 在此信息不可用的系統上,此方法等效於調用 getFreeSpace()。
*/
//21427404800
System.out.println(file.getUsableSpace()>>10>>10>>10);
/***
* 返回此抽象路徑名指定的分區大小。
* 返回:
*
* 分區的大小,以字節爲單位;如果此抽象路徑名沒有指定分區,則返回 0L。
*/
// 62271778816
System.out.println(file.getTotalSpace()>>10>>10>>10);
}
/**
*
* 總結:
* 絕對路徑 與 普通路徑 一致
* 與權威路徑 不同 權威路徑能夠識別路徑中的 .. 可以得到真實路徑
*
* 獲得文件名 直接getName 獲得單獨文件名稱
*
* 獲得父目錄 兩個方法 都是獲得全部路徑加點 需要特殊處理
*
* 盤符大小 一致 不特別說明
*
*/
public static void testVultr(){
file = new File("D:\\tomcat7\\tes001\\00202\\..\\001.txt");
// D:\tomcat7\tes001\00202\..\001.txt
System.out.println(file.getAbsolutePath());
try {
//D:\tomcat7\tes001\001.txt
System.out.println(file.getCanonicalPath());
} catch (IOException e1) {
e1.printStackTrace();
}
// D:\tomcat7\tes001\00202\..\001.txt
System.out.println(file.getPath());
// 001.txt
System.out.println(file.getName());//獲得文件名
// D:\tomcat7\tes001\00202\..\001.txt
System.out.println(file.getAbsoluteFile());
try {
// D:\tomcat7\tes001\001.txt
System.out.println(file.getCanonicalFile());
} catch (IOException e) {
e.printStackTrace();
}
//獲得父目錄
// D:\tomcat7\tes001\00202\..
System.out.println(file.getParent());
// D:\tomcat7\tes001\00202\..
System.out.println(file.getParentFile());
}
/***
* 測試相對路徑
*
* 與其之前的相比
*
* 絕對路徑與權威路徑 相同
*
* 普通路徑與文件名相同
*
* 絕對文件和權威文件都是獲取文件路徑+文件名
*
* 最大區別是父目錄無法獲取 爲null
*
*/
public static void testMix(){
//相同包下的一個java類
file = new File("FileRename.java");
//E:\projectDIR\java_code\o2oSpace\Test\FileRename.java
System.out.println(file.getAbsolutePath());
try {
System.out.println(file.getCanonicalPath());
} catch (IOException e1) {
e1.printStackTrace();
}
//FileRename.java
System.out.println(file.getPath());
System.out.println(file.getName());//獲得文件名
//E:\projectDIR\java_code\o2oSpace\Test\FileRename.java
System.out.println(file.getAbsoluteFile());
try {
System.out.println(file.getCanonicalFile());
} catch (IOException e) {
e.printStackTrace();
}
//獲得父目錄
//null
System.out.println(file.getParent());
System.out.println(file.getParentFile());
}
}
代碼運行 需要配置自己的文件名
ps: 路徑中的.. 是上級文件夾的意思
針對文件的三種路徑,簡單易記的方案是:
1.如果需要獲取全路徑+文件名
使用 權威路徑getCanonicalPath 是最穩妥的
2.如果只是單獨獲得文件名 ,直接getName
3. 若果獲得父目錄 (在相對路徑中不能獲取)
getParent返回字符
getParentFile返回文件
4.獲取盤空間的剩餘大小方案中儘量使用getUsableSpace
最好的方案其實就是寫路徑儘量使用絕對路徑 在後續操作上會好很多
如果沒辦法使用絕對路徑 , 卻要獲取父目錄 可以先獲取全路徑然後再截斷的方式獲得
暫時想到的就是這麼多,歡迎留言指正!