最近一直在忙項目,所以沒有及時更新小知識,今天就為大家講一下file的知識點。首先呢,我們需要了解文件路徑的概念。文件路徑就是文件在電腦中的位置,表示文件路徑的方式有兩種:相對路徑和絕對路徑。相對路徑是指目標(biāo)相對于當(dāng)前文件的路徑,例如:“./index.html”。絕對路徑:從盤符開始的路徑或者網(wǎng)址的全路徑,例如“C:\windows\system32\cmd.exe”或者“https://blog.csdn.net/Qingai521”。
相對路徑表示的方法:
- ./ :代表文件所在的目錄(可以省略不寫)
- ../ :代表文件所在的父級目錄
- ../../ :代表文件所在的父級目錄的父級目錄
- / :代表文件所在的根目錄
File構(gòu)造方法
注意:File沒有無參構(gòu)造方法, 因為創(chuàng)建一個File對象必須要指向某個路徑才行,而這個路徑就是調(diào)用有參構(gòu)造方法傳入的。
File(String pathname):根據(jù)一個路徑得到File對象。
File(String parent, String child):根據(jù)一個目錄和一個子文件/目錄得到File對象
File(File parent, String child):根據(jù)一個父File對象和一個子文件/目錄得到File對象
代碼演示:
public static void demo1() {
File file = new File("F:\\double\\video\\today.avi");//絕對路徑
System.out.println(file.exists());
File file2 = new File("xxx.txt"); //相對路徑 相對于項目而言
System.out.println(file2.exists());
File file3 = new File("yyy.txt"); //相對路徑 相對于項目而言
System.out.println(file3.exists());
}
public static void demo2() {
String parent = "F:\\double\\video";
String child = "today.avi";
File file = new File(parent,child);
System.out.println(file.exists());
}
public static void main(String[] args) {
File parent = new File("F:\\double\\video");
String child = "today.avi";
File file = new File(parent, child);
System.out.println(file.exists());
System.out.println(parent.exists());
}
File創(chuàng)建功能
public boolean createNewFile():創(chuàng)建文件,如果存在這樣的文件,就不創(chuàng)建了;
public boolean mkdir()//只會建立一級的文件夾;
public boolean mkdirs():創(chuàng)建文件夾,如果父文件夾不存在,會幫你創(chuàng)建出來;
代碼演示:
public static void main(String[] args) throws IOException {
File dir1 = new File("aaa");
System.out.println(dir1.mkdir());//創(chuàng)建成功則返回true,如果該目錄存在則返回false
File dir2 = new File("bbb.txt");//這樣寫是可以的,文件夾也是可以有后綴的
System.out.println(dir2.mkdir());//雖然傳入的是"bbb.txt",但是創(chuàng)建的是文件夾
File dir3 = new File("ccc\\ddd");
System.out.println(dir3.mkdirs()); //創(chuàng)建多級目錄
}
public static void demo() throws IOException {
File file = new File("yyy.txt");
System.out.println(file.createNewFile());//如果沒有就創(chuàng)建,返回true
File file2 = new File("zzz");
//可以不寫后綴,創(chuàng)建成功則返回true;如果文件已經(jīng)存在 就返回false
System.out.println(file2.createNewFile());
}
File刪除功能
public boolean delete():刪除文件或者文件夾
注意:Java中的刪除不走回收站;要刪除一個文件夾,請注意該文件夾內(nèi)不能包含文件或者文件夾。
代碼演示:
public static void main(String[] args) {
File file1 = new File("yyy.txt");
System.out.println(file1.delete());//刪除文件
File file2 = new File("aaa");
System.out.println(file2.delete());//刪除文件夾
File file3 = new File("ccc"); //如果刪除一個文件夾,那么文件夾必須是空的
System.out.println(file3.delete());
}
File重命名功能
public boolean renameTo(File dest):把文件重命名為指定的文件路徑
注意:如果路徑名相同,就是改名;如果路徑名不同,就是改名并剪切。
代碼演示:
public static void demo() {
File file1 = new File("ooo.txt");
File file2 = new File("D:\\xxx.txt");
System.out.println(file1.renameTo(file2)); //不同路徑,剪切并改名;改名成功則返回true
}
File判斷功能
public boolean isDirectory():判斷是否是目錄
public boolean isFile():判斷是否是文件
public boolean exists():判斷是否存在
public boolean canRead():判斷是否可讀
public boolean canWrite():判斷是否可寫
public boolean isHidden():判斷是否隱藏
注意:windows系統(tǒng)認(rèn)為所有的文件都是可讀的;canWrite() 與windows系統(tǒng)文件的“只讀”屬性有關(guān);isHidden() 與windows系統(tǒng)文件的“隱藏”屬性有關(guān)
代碼演示:
public static void main(String[] args) {
File file = new File("zzz");
file.setReadable(false);
System.out.println(file.canRead()); //windows系統(tǒng)認(rèn)為所有的文件都是可讀的
file.setWritable(true);
System.out.println(file.canWrite()); //windows系統(tǒng)可以設(shè)置為不可寫
File file2 = new File("aaa.txt");
System.out.println(file2.isHidden()); //判斷是否是隱藏文件
System.out.println(file.isHidden());
}
public static void demo() {
File dir1 = new File("ccc");
System.out.println(dir1.isDirectory()); //判斷是否是文件夾
File dir2 = new File("zzz");
System.out.println(dir2.isDirectory());
System.out.println(dir1.isFile()); //判斷是否是文件
System.out.println(dir2.isFile());
}
File獲取功能
public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取路徑
public String getName():獲取名稱
public long length():獲取長度。字節(jié)數(shù)
public long lastModified():獲取最后一次的修改時間,毫秒值
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
-
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
注意:getPath() 獲取的是構(gòu)造方法里面?zhèn)魅氲穆窂?/p>
代碼演示:
public static void main(String[] args) {
File dir = new File("F:/double/day/video");
String[] arr = dir.list(); //獲取F:/double/day/video下所有的文件和文件夾的名稱
for (String string : arr) {
System.out.println(string);
}
File[] subFiles = dir.listFiles();
for (File file : subFiles) { //獲取F:/double/day/video下所有的文件和文件夾對象
System.out.println(file);
}
}
public static void demo() {
File file1 = new File("ccc.txt");
File file2 = new File("D:\\double\\day\\ccc.txt");
System.out.println(file1.getAbsolutePath()); //獲取絕對路徑
System.out.println(file2.getAbsolutePath());
System.out.println(file1.getPath()); //獲取構(gòu)造方法中傳入路徑
System.out.println(file2.getPath());
System.out.println(file1.getName()); //獲取文件或者文件的名字
System.out.println(file2.getName());
System.out.println(file1.length());
Date d = new Date(file1.lastModified()); //文件的最后修改時間
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf.format(d));
}
案例:獲取指定目錄下以.jpg結(jié)尾的文件
?
public static void main(String[] args) {
File dir = new File("E:\\");
//方法一
File[] subFiles = dir.listFiles(); //獲取e盤下所有的文件或文件夾對象
for (File subFile : subFiles) {
//判斷是否是文件 判斷文件的名字是否以.jpg結(jié)尾
if(subFile.isFile() && subFile.getName().endsWith(".jpg")) {
System.out.println(subFile); //這樣方法就只能獲取到以.jpg結(jié)尾的文件
}
}
//方法二
String[] arr = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//dir就是new File("E:\\")對象。name 就是E盤下每個文件和文件夾的名字
File file = new File(dir, name); //把E盤下每個文件名稱封裝成File對象
return file.isFile() && file.getName().endsWith(".jpg");//判斷E盤下每個文件對象 是否是文件 判斷文件的名字是否以.jpg結(jié)尾
}
});
for (String string : arr) {
System.out.println(string);
}
}
文件名稱過濾器的使用源碼分析
public File{
public String[] list(FilenameFilter filter) { //filter接收我們傳入的文件名稱過濾器對象(也就是傳入的匿名內(nèi)部類)
String names[] = list(); //獲取this對象下所有的文件和文件夾的名字存到names[]數(shù)組中
if ((names == null) || (filter == null)) {//判斷文件過濾器是否為null
return names;
}
//創(chuàng)建一個ArrayList集合,用來保存文件名稱過濾器過濾出來的文件名稱
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {//遍歷names[]數(shù)組
if (filter.accept(this, names[i])) {//用傳入的文件名稱過濾器對象(也就是傳入的匿名內(nèi)部類)調(diào)用accept方法(就是匿名內(nèi)部類中重寫的方法),并且傳入this和this對象下每個文件和文件夾的名字,看是否符合過濾器過濾條件
v.add(names[i]); //如果符合過濾器過濾條件 就添加到集合中
}
}
return v.toArray(new String[v.size()]);//把集合轉(zhuǎn)成數(shù)組并返回
}
}
好了今天就先說到這了,明天繼續(xù)。想了解更多學(xué)習(xí)知識,請關(guān)注微信公眾號“阿Q說”,獲取更多學(xué)習(xí)資料吧!你也可以后臺留言說出你的疑惑,阿Q將會在后期的文章中為你解答。每天學(xué)習(xí)一點點,每天進(jìn)步一點點。
?