国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java中表示一個(gè)文件的File類型詳解

java中表示一個(gè)文件的File類型詳解

2021-05-12 15:40Single_Yam Java教程

Java提供File類,讓我們對(duì)文件進(jìn)行操作,下面這篇文章主要給大家介紹了關(guān)于java中表示一個(gè)文件的File類型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

從本篇文章開(kāi)始,我們將開(kāi)啟對(duì) java io 系統(tǒng)的學(xué)習(xí),本質(zhì)上就是對(duì)文件的讀寫(xiě)操作,聽(tīng)上去簡(jiǎn)單,其實(shí)并不容易。java 的 io 系統(tǒng)一直在完善和改進(jìn),設(shè)計(jì)了大量的類,也只有理解了這些類型被設(shè)計(jì)出來(lái)的意義以及各自的應(yīng)用場(chǎng)景,才能提升文件 io 的理解。

那么,第一步就是要解決如何表示一個(gè)文件的問(wèn)題,java 世界中「萬(wàn)物皆對(duì)象」,如何將一個(gè)實(shí)際磁盤(pán)文件或目錄對(duì)應(yīng)到一個(gè) java 對(duì)象則是我們首要的問(wèn)題。

java 中使用 file 來(lái)抽象一個(gè)文件,無(wú)論是普通文件或是目錄,都可對(duì)應(yīng)于一個(gè) file 對(duì)象。我覺(jué)得大家對(duì)于 file 這個(gè)類型的定位一定要準(zhǔn)確:它只是抽象的代表了磁盤(pán)上的某個(gè)文件或目錄,內(nèi)部實(shí)際上是依賴一個(gè)平臺(tái)無(wú)關(guān)的本地文件系統(tǒng)類,并且 file 無(wú)法對(duì)其所表示文件內(nèi)容進(jìn)行任何讀寫(xiě)操作(那是流做的事情)。

構(gòu)建一個(gè) file 實(shí)例

在實(shí)際介紹 file 實(shí)例構(gòu)造方法之前,我們得先看看它的幾種重要的屬性成員。

?
1
private static final filesystem fs = defaultfilesystem.getfilesystem();

這是 file 類中最核心的成員,它表示為當(dāng)前系統(tǒng)的文件系統(tǒng) api,所有向磁盤(pán)發(fā)出的操作都是基于這個(gè)屬性的。

?
1
private final string path;

path 代表了當(dāng)前實(shí)例的完整路徑名稱,如果當(dāng)前的 file 實(shí)例表示的是目錄的話,那么 path 的值就是這個(gè)完整的目錄名稱,如果表示的是純文件的話,那么這個(gè) path 的值等于該文件的完整路徑 + 文件名稱。

?
1
2
public static final char separatorchar = fs.getseparator();
public static final char pathseparatorchar = fs.getpathseparator();

separatorchar 表示的是目錄間的分隔符,pathseparatorchar 表示的是不同路徑下的分隔符,這兩個(gè)值在不同的系統(tǒng)平臺(tái)下不盡相同。例如 windows 下這兩者的值分別為:「」 和 「;」,其中封號(hào)用于分隔多個(gè)不同路徑。

file 類提供了四種不同的構(gòu)造器用于實(shí)例化一個(gè) file 對(duì)象,但較為常用的只有三個(gè),我們也著重學(xué)習(xí)前三個(gè)構(gòu)造器。

?
1
public file(string pathname)

這是最普遍的實(shí)例化一個(gè) file 對(duì)象的方法,pathname 的值可以是一個(gè)目錄,也可以是一個(gè)純文件的名稱。例如:

?
1
2
3
4
5
file file = new file("c:\\users\\yanga\\desktop");
 
file file1 = new file("c:\\users\\yanga\\desktop\\a.txt");
 
file file2 = new file("a.txt");

當(dāng)然也可以顯式指定一個(gè)父路徑:

?
1
public file(string parent, string child)

在構(gòu)造器的內(nèi)部,程序會(huì)為我們拼接出一個(gè)完整的文件路徑,例如:

?
1
2
3
file file = new file("c:\\users\\yanga\\desktop","a.txt");
 
file file1 = new file("c:\\users\\yanga\\desktop","java");

第三種構(gòu)造器其實(shí)本質(zhì)上和第二種是一樣的,只不過(guò)增加了一個(gè)父類 file 實(shí)例的封裝過(guò)程:

?
1
public file(file parent, string child)

類似的情況,不再舉例說(shuō)明了。我們這里并沒(méi)有深究這些構(gòu)造器的內(nèi)部具體實(shí)現(xiàn)情況,并不是說(shuō)它簡(jiǎn)單,而是 file 過(guò)度依賴本地文件系統(tǒng),很多方法的實(shí)現(xiàn)情況都不得直接看到,所以對(duì)于 file 的學(xué)習(xí),定位為熟練掌握即可,具體實(shí)現(xiàn)暫時(shí)沒(méi)法深入學(xué)習(xí)。

文件名稱或路徑相關(guān)信息獲取

getname 方法可以用于獲取文件名稱:

?
1
2
3
4
5
public string getname() {
 int index = path.lastindexof(separatorchar);
 if (index < prefixlength) return path.substring(prefixlength);
 return path.substring(index + 1);
}

還記得我們的 separatorchar 表示的是什么了嗎?

它表示為路徑分隔符,windows 中為符號(hào)「」,path 屬性存儲(chǔ)的當(dāng)前 file 實(shí)例的完整路徑名稱,所以最后一次出現(xiàn)的位置后面所有的字符必然是我們的文件名稱。

當(dāng)然你一定發(fā)現(xiàn)了,對(duì)于純文件來(lái)說(shuō),該方法能夠返回文件的簡(jiǎn)單名稱,而對(duì)于一個(gè)目錄而言,返回值將會(huì)是最近的目錄名。例如:

?
1
2
3
4
5
file file = new file("c:\\users\\yanga\\desktop\\a.txt");
system.out.println(file.getname());
 
file file1 = new file("c:\\users\\yanga\\desktop");
system.out.println(file1.getname());

輸出結(jié)果不會(huì)出乎你的意料:

?
1
2
a.txt
desktop

getparent 方法用于返回當(dāng)前文件的父級(jí)目錄,無(wú)論你是純文件或是目錄,你終有你的父目錄(當(dāng)然,虛擬機(jī)生成的臨時(shí)文件自然不是)。

?
1
2
3
4
5
6
7
8
9
public string getparent() {
 int index = path.lastindexof(separatorchar);
 if (index < prefixlength) {
 if ((prefixlength > 0) && (path.length() > prefixlength))
 return path.substring(0, prefixlength);
 return null;
 }
 return path.substring(0, index);
}

方法的實(shí)現(xiàn)很簡(jiǎn)單,不再贅述。

getpath 方法可以返回當(dāng)前 file 實(shí)例的完整文件名稱:

?
1
2
3
public string getpath() {
 return path;
}

以下是一些有關(guān)目錄的相關(guān)操作,實(shí)現(xiàn)比較簡(jiǎn)單,此處簡(jiǎn)單羅列了:

  • public boolean isabsolute():是否為絕對(duì)路徑
  • public string getabsolutepath():獲取當(dāng)前 file 實(shí)例的絕對(duì)路徑
  • public string getcanonicalpath():返回當(dāng)前 file 實(shí)例的標(biāo)準(zhǔn)路徑

這里我們需要對(duì) getcanonicalpath 做一點(diǎn)解釋,什么叫標(biāo)準(zhǔn)路徑,和絕對(duì)路徑有區(qū)別嗎?

一般而言,「../」表示源文件所在目錄的上一級(jí)目錄,「../../」表示源文件所在目錄的上上級(jí)目錄,并以此類推。getabsolutepath 方法不會(huì)做這種轉(zhuǎn)換的操作,而 getcanonicalpath 方法則會(huì)將這些特殊字符進(jìn)行識(shí)別并取合適的語(yǔ)義。

例如:

?
1
2
3
file file = new file("..\\a.txt");
system.out.println(file.getabsolutepath());
system.out.println(file.getcanonicalpath());

輸出結(jié)果:

c:\users\yanga\desktop\java\workspace2017\testfile\..\a.txt
c:\users\yanga\desktop\java\workspace2017\a.txt

前者會(huì)將「..\a.txt」作為文件路徑名稱的一部分,而后者卻能夠識(shí)別「..\a.txt」表示的是「a.txt」位于當(dāng)前目錄的上級(jí)目錄中。這就是兩者最大的不同之處,適合不同的情境。

文件的屬性信息獲取

這部分的文件操作其實(shí)很簡(jiǎn)單,無(wú)非是一些文件權(quán)限的問(wèn)題,是否可讀,是否可寫(xiě),是否為隱藏文件等。下面我們具體看看這些方法:

  • public boolean canread():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否可讀
  • public boolean canwrite():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否可寫(xiě)
  • public boolean exists():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否實(shí)際存在
  • public boolean isdirectory():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否是一個(gè)目錄
  • public boolean isfile():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否是一個(gè)純文件
  • public boolean ishidden():該抽象的 file 實(shí)例對(duì)應(yīng)的文件是否是一個(gè)隱藏文件
  • public long length():文件內(nèi)容所占的字節(jié)數(shù)

需要說(shuō)明一點(diǎn)的是,length 方法對(duì)于純文件來(lái)說(shuō),可以正確返回該文件的字節(jié)總數(shù),但是對(duì)于一個(gè)目錄而言,返回值將會(huì)是一個(gè)「unspecified」的數(shù)值,既不是目錄下所有文件的總字節(jié)數(shù),也不是零,只是一個(gè)未被說(shuō)明的數(shù)值,沒(méi)有意義。

文件的操作

文件的操作無(wú)外乎「增刪改查」,下面我們一起來(lái)看看。

  • public boolean createnewfile():根據(jù)抽象的 file 對(duì)象創(chuàng)建一個(gè)實(shí)際存在的磁盤(pán)文件
  • public boolean delete():刪除該 file 對(duì)象對(duì)應(yīng)的磁盤(pán)文件,刪除失敗會(huì)返回 false

當(dāng)然,處理上述兩個(gè)簡(jiǎn)單的新建和刪除操作,file 類還提供了所謂「查詢」操作,這個(gè)我們要好好學(xué)習(xí)一下。例如:

?
1
2
3
4
5
6
7
8
9
10
public string[] list() {
 securitymanager security = system.getsecuritymanager();
 if (security != null) {
 security.checkread(path);
 }
 if (isinvalid()) {
 return null;
 }
 return fs.list(this);
}

這個(gè)方法會(huì)檢索出當(dāng)前實(shí)例所代表的目錄下所有的「純文件」和「目錄」簡(jiǎn)單名稱集合。例如:

?
1
2
3
4
5
file file = new file("c:\\users\\yanga\\desktop");
string[] list = file.list();
for (string str : list){
 system.out.println(str);
}

程序的輸出結(jié)果會(huì)打印我電腦桌面目錄下所有的文件的簡(jiǎn)單名稱,就不給大家看了。

需要注意一點(diǎn),如果我們的 file 實(shí)例對(duì)應(yīng)的不是一個(gè)目錄,而是一個(gè)純文件,那么 list 將返回 null。

接著,我們?cè)倏匆粋€(gè)檢索目錄文件的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public string[] list(filenamefilter filter) {
 string names[] = list();
 if ((names == null) || (filter == null)) {
 return names;
 }
 list<string> v = new arraylist<>();
 for (int i = 0 ; i < names.length ; i++) {
 if (filter.accept(this, names[i])) {
  v.add(names[i]);
 }
 }
 return v.toarray(new string[v.size()]);
}

這個(gè)方法其實(shí)是 list 的重載版本,它允許傳入一個(gè)過(guò)濾器用于檢索目錄時(shí)只篩選我們需要的文件及目錄。

而這個(gè) filenamefilter 接口的定義卻是如此簡(jiǎn)單:

?
1
2
3
public interface filenamefilter {
 boolean accept(file dir, string name);
}

只需要重寫(xiě)這個(gè) accept 方法即可,list 的 for 循環(huán)每獲取一個(gè)文件或目錄就會(huì)嘗試著先調(diào)用這個(gè)過(guò)濾方法,如果通過(guò)篩選,才會(huì)將當(dāng)前文件的簡(jiǎn)單名稱添加進(jìn)返回集合中。

所以這個(gè) accept 方法的重寫(xiě)就決定著哪些文件能夠通過(guò)篩選,哪些則不能。我們看個(gè)例子:

我的桌面上 test 文件夾下文件情況如下:

java中表示一個(gè)文件的File類型詳解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file file = new file("c:\\users\\yanga\\desktop\\test");
 string[] list = file.list(
 new filenamefilter() {
  @override
  public boolean accept(file dir, string name) {
  // dir 代表的當(dāng)前 file 對(duì)象
  //name 是當(dāng)前遍歷的文件項(xiàng)的簡(jiǎn)單名稱
  if (!name.endswith(".txt"))
   return false;
  else
   return true;
  }
 }
 );
 for (string str : list){
 system.out.println(str);
 }

這里呢,我們使用匿名內(nèi)部類創(chuàng)建一個(gè) filenamefilter 的子類實(shí)例,然后實(shí)現(xiàn)了它的 accept 方法,具體的實(shí)現(xiàn)很簡(jiǎn)單,過(guò)濾掉所有的目錄并取出所有純文件的簡(jiǎn)單名稱。

最后輸出結(jié)果如下:

3.txt
4.txt

當(dāng)然,file 類中還提供了兩個(gè)「變種」list 方法,例如:

  • public file[] listfiles()
  • public file[] listfiles(filenamefilter filter)

它們不再返回目標(biāo)目錄下的「純文件」和「目錄」的簡(jiǎn)單名稱,而返回它們所對(duì)應(yīng)的 file 對(duì)象,其實(shí)也沒(méi)什么,目標(biāo)目錄 + 簡(jiǎn)單名稱 即可構(gòu)建出這些 file 實(shí)例了。

所以,本質(zhì)上說(shuō),list 方法并不會(huì)遍歷出目標(biāo)目錄下的所有文件,即目標(biāo)目錄的子目錄中的文件并不會(huì)被訪問(wèn)遍歷。

所以你應(yīng)當(dāng)思考如何完成目標(biāo)目錄下所有文件的遍歷,包含一級(jí)子目錄下的深層次文件的遍歷。文末將給出答案。

接下來(lái)的兩個(gè)方法和文件夾的創(chuàng)建有關(guān):

  • public boolean mkdir()
  • public boolean mkdirs()

兩者都是依據(jù)的當(dāng)前 file 實(shí)例創(chuàng)建文件夾,關(guān)于它們的不同點(diǎn),我們先看一段代碼:

?
1
2
3
4
5
file file = new file("c:\\users\\yanga\\desktop\\test2");
system.out.println(file.mkdir());
 
file file2 = new file("c:\\users\\yanga\\desktop\\test3\\hello");
system.out.println(file2.mkdir());

其中,test2 和 test3 在程序執(zhí)行之前都不存在。

輸出結(jié)果如下:

true
false

為什么后者創(chuàng)建失敗了?

這源于 mkdir 方法一次只能創(chuàng)建一個(gè)文件夾,倘若給定的目錄的父級(jí)或更上層目錄存在未被創(chuàng)建的目錄,那么將導(dǎo)致創(chuàng)建失敗。

而 mkdirs 方法就是用于解決這種情境的,它會(huì)創(chuàng)建目標(biāo)路徑上所有未創(chuàng)建的目錄,看代碼:

?
1
2
file file3 = new file("c:\\users\\yanga\\desktop\\test3\\hello\\231");
system.out.println(file3.mkdirs());

即便我們 test3 文件夾就不存在,程序運(yùn)行之后,test3、hello、231 這三個(gè)文件夾都會(huì)被創(chuàng)建出來(lái)。

除此之外,file 還有一類創(chuàng)建臨時(shí)文件的方法,所謂臨時(shí)文件即:運(yùn)行期存在,虛擬機(jī)關(guān)閉時(shí)銷毀。大家可以自行研究,使用上還是比較簡(jiǎn)單的,這里不再贅述了。

至此,有關(guān) file 這個(gè)文件類型,我們大致學(xué)習(xí)了一下,想必大家都會(huì)或多或少的感覺(jué)到將純文件和目錄使用同一個(gè)類型進(jìn)行表示的設(shè)計(jì)似乎有些混亂不合理。知道 jdk1.7 sun 推出了 files 和 path 分離了文件和目錄,我們后續(xù)文章會(huì)詳細(xì)學(xué)習(xí)一下。

文章中的所有代碼、圖片、文件都云存儲(chǔ)在我的 github 上:

(https://github.com/singleyam/overview_java)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/yangming1996/p/9020069.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品一级| 香蕉成人啪国产精品视频综合网 | 草草在线观看 | 亚洲在线一区二区 | 亚洲国产91| 激情综合欧美 | av在线播放网 | 久久综合九色综合欧美狠狠 | 日韩国产精品一区二区三区 | 国产精品一区二区三区四区 | 韩日在线| 成人午夜视频在线 | 免费观看在线午夜影视 | 山岸逢花在线观看无删减 | 国产精品视频一 | 久久久久久久久久久影视 | 一级一片免费 | 国产美女久久 | 99这里只有精品视频 | 精品影视| 中国一级黄色毛片视频 | 成人久久久久久久 | 国产精品亚洲综合 | 日韩久久久久久 | av中文字幕在线 | 免费三级国产 | 黄色小视频在线免费观看 | 国产精品视频 | 久久久一区二区三区 | 亚洲一区二区 | 国产综合亚洲精品一区二 | 国产精品久久久亚洲 | 精品久久一区二区三区 | 欧美日韩在线视频免费 | 欧美精品久久久久 | 欧美二区三区 | 在线国产一区 | 日韩精品专区在线影院重磅 | 91黄在线观看 | 日韩精品无码一区二区三区 | 一本大道伊人久久综合 |