【Java基礎知識】IO流--File類和路徑分隔符
IO流–FIle類和路徑分隔符
1 File類
1.1 File類概述
我們想要操作IO,就必須知道硬碟上檔案的表現形式。File類:IO類包中唯一代表檔案本身的物件,檔案和目錄(資料夾)路徑名的抽象表示形式。File類提供各種方法,我們可以建立、刪除、重新命名檔案,判斷檔案的讀寫許可權,是否存在,設定和查詢檔案的最近修改時間。File類不能訪問檔案的內容,不能夠從檔案中讀取資料或往檔案裡寫資料,它只能對檔案本身的屬性進行操作。
1.2 File類的構造方法
File(String pathname):根據一個路徑得到File物件。 File(String parent, String child):根據一個目錄和一個子檔案/目錄得到File物件 File(File parent, String child):根據一個父File物件和一個子檔案/目錄得到File物件。
1.3 建立File物件
【要注意區分你所建立的是資料夾,還是檔案】
public boolean createNewFile():建立檔案,建立成功返回true, 如果存在這樣的檔案,就不建立了,返回false。
public boolean mkdir():建立資料夾【父目錄必須存在】,如果存在這樣的資料夾,就不建立了。
public boolean mkdirs():建立資料夾,如果父資料夾不存在,會幫你創建出來。
1.4 刪除File物件
public boolean delete():刪除此抽象路徑名錶示的檔案或目錄。
如果要刪除一個資料夾,則所給資料夾必須為空才可刪除【即該資料夾內不能包括檔案或資料夾】。
在Eclipse中建立檔案或資料夾時,如果忘記寫碟符,在預設是在專案路徑下建立。
Java中File物件的刪除不走回收站,直接刪除。
1.5 重新命名
public boolean renameTo(File dest)
如果路徑名相同,就是改名;如果路徑名不同,就是改名並剪下。
絕對路徑:路徑以碟符開始。
相對路徑:路徑不以碟符開始。
1.6 判斷類方法
public boolean isDirectory():判斷是否是目錄
public boolean isFile():判斷是否是檔案
public boolean exists():判斷是否存在
public boolean canRead():判斷是否可讀
public boolean canWrite():判斷是否可寫
public boolean isHidden():判斷是否隱藏
1.7 獲取檔案資訊
public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取相對路徑
public String getName():獲取名稱
public long length():獲取長度。位元組數
public long lastModified():獲取最後一次的修改時間,毫秒值
1.8 案例一:輸出D盤目錄下,字尾名以.txt結尾的檔名稱
方法一:直接使用File類的基本方法解決
分析:
A:封裝e判斷目錄
B:獲取該目錄下所有檔案或者資料夾的File陣列
C:遍歷該File陣列,得到每一個File物件,然後判斷
D:是否是檔案
是:繼續判斷是否以.txt結尾
是:就輸出該檔名稱
否:不處理
否:不處理
public class FileDemo {
public static void main(String[] args) {
File file = new File("D:\\");
File[] fileArray = file.listFiles();
for(File f : fileArray){
if(f.isFile() && f.getName().endsWith(".txt")){
System.out.println(f.getName());
}
}
}
}
/*執行結果:
* 摸金天師.txt
* 盜墓筆記.txt
* 鬼吹燈.txt
* */
方法二:使用檔案過濾器作為引數,呼叫list(filter)或者listFiles(filter)方法。
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
呼叫List()方法,並且傳入FilenameFilter 物件作為引數。
FilenameFilter介面的原始碼如下:
public
interface FilenameFilter {
//測試指定檔案是否應該包含在某一檔案列表中。
//引數:File被找到的檔案所在的目錄,name檔案的名稱。
boolean accept(File dir, String name);
}
public String[] list(FilenameFilter filter)原始碼如下:
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[v.size()]));
}
程式碼案例:
public class FilenameFilterDemo {
public static void main(String[] args) {
File file = new File("D:\\");
//將實現FilenameFilter介面的匿名類作為list()的引數
String[] strArray = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".txt");
}
});
for (String s : strArray) {
System.out.println(s);
}
}
}
/*執行結果:
* 摸金天師.txt
* 盜墓筆記.txt
* 鬼吹燈.txt
* */
1.9 案例二:將D盤下的檔名稱批量重新命名
E:\電視劇\漢武大帝\漢武大帝001[電視劇迅雷下載電影天堂]_漢景帝削藩.avi,
改為:E:\評書\三國演義\001_漢景帝削藩.avi
public class FileRenameDemo {
public static void main(String[] args) {
//E:\電視劇\漢武大帝\漢武大帝_001_[電視劇_迅雷下載_電影天堂]_漢景帝削藩.avi
File srcFolder = new File("E:\\電視劇\\漢武大帝");
File[] fileArray = srcFolder.listFiles();
for (File file : fileArray) {
String name = file.getName();
int index = name.indexOf("_");
String numberString = name.substring(index + 1, index + 4);
int endIndex = name.lastIndexOf('_');
String nameString = name.substring(endIndex);
String newName = numberString.concat(nameString);//001_漢景帝削藩.avi
//System.out.println(newName);
File newFile = new File(srcFolder, newName);
file.renameTo(newFile);
//修改後:E:\評書\三國演義\001_漢景帝削藩.avi
}
}
}
2 路徑分隔符需要注意的問題
2.1 各系統的路徑分隔表示
Unix和Mac下的路徑分隔符為:【/ 】
DOS下的路徑分隔符為:【\】
Java可以正確處理Unix和Dos的路徑分隔符:
即使我們在Windows下使用(/)作為路徑分隔符,Java仍然能夠正確處理。
由於反斜線用來表示轉義字元,因此,表示路徑分隔符需用兩個反斜線。
在Java程式中我們使用\表示單反斜線(),使用\\表示雙反斜線(\).
2.2 程式設計中如何處理路徑分隔符
路徑分割符號問題,不同的作業系統不同,在程式中不要硬性編碼與平臺相關的任何常量.
可以使用File.separator得到不同系統下的路徑分隔符。
String sep = File.separator;
file = new File(“d:”+sep+”develop”, “data.txt”);
public class SeparatorDemo {
public static void main(String[] args) {
String sep = File.separator;
File file =new File("E:"+sep+"E-Book"+sep+"leetcode-cpp刷題.pdf");
System.out.println(file.getAbsolutePath());
}
}
/*
* E:\E-Book\leetcode-cpp刷題.pdf
* */