圖解 Java IO : 一、File源碼

來源:互聯網
上載者:User

標籤:

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

記得Java源碼是集合開始看的,寫了一系列集合相關的文章,受到不錯的評價。感謝各位讀者。我依舊會讀到老寫到老,並生動形象的寫出來心得體會。這次依舊是圖解,我研究IO這塊。

Java IO – File的要點,應該是

1、跨平台問題的解決

2、檔案的安全

3、檔案的檢索方法

一、代碼小引入

代請看一個簡單的小demo:(ps:開源項目java-core-learning地址https://github.com/JeffLi1993

?
1234567891011121314151617181920212223242526272829303132333435363738 import java.io.File;import java.util.Arrays;/* * Copyright [2015] [Jeff Lee] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Jeff Lee * @since 2015-7-13 07:58:56 * 列出目錄並排序 */public class DirListT {    public static void main(String[] args) {        // 擷取目前的目錄        File path = new File(".");// .表示目前的目錄        // 檔案路徑名數組        String list[] = path.list();                 // 對String檔案名稱進行排序        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);                 // 列印        for(String dirItem : list)            System.out.println(dirItem);    }}

在eclipse中,右鍵run一下,可以得到如下的結果:

,很容易注意到了,其目錄下的名字排序按字母並列印了。

先回顧下API知識吧,

首先建構函式 public File(String pathname)

通過將給定路徑名字串轉換為抽象路徑名來建立一個新 File 執行個體。如果給定字串是Null 字元串,那麼結果是空抽象路徑名。

參數:
pathname – 路徑名字串
拋出:
NullPointerException – 如果  pathname 參數為  null

二者,File實現了Comparator介面,以便對FileName進行排序

static Comparator<String>
     CASE_INSENSITIVE_ORDER
          一個對 String 對象進行排序的 Comparator,作用與 compareToIgnoreCase 相同。

三者, path.list()為什麼會返回String[] filenams的數組呢?怎麼不是List呢?

自問自答:這時候,我們應該去看看ArrayList的實現,ArrayList其實是動態數組實現。動態,動態弊端就是效率低。此時,返回一個固定的數組,而不是一個靈活的類容器,因為其目錄元素是固定的。下面是ArrayList和數組Array的比較

 

二、深入理解源碼

File,File究竟是怎麼構成的。順著源碼,知道了File有幾個重要屬性

1、static private FileSystem fs

     FileSystem : 對本地檔案系統的抽象

2、String path 檔案路徑名

3、內聯枚舉類

     PathStatus 地址是否合法 ENUM類 private static enum PathStatus { INVALID, CHECKED };

4、prefixLength 前置長度

如下,給出File相關核心的UML圖

 

其實操作的是 FileSystem : 對本地檔案系統的抽象,真正操作的是 FileSytem衍生類別。通過源碼Ctrl+T發現如下:Win下操作的是 Win32FileSystem 和 WinNTFileSystem類。看來真正通過jvm,native調用系統的File是他們。

Linux呢?因此,下了個Linux版本的JDK,解壓,找到rt.jar。然後java/io目錄中,找到了UnixFileSystem類。真相大白了!

 

所以可以小結File操作源碼這樣調用的:中間不同JDK,其實是不同的類調用本機native方法

三、小demo再來一發

File 其實和我們在系統中看的的檔案一樣。就像我們右鍵,屬性。可以看到很多File的資訊。Java File也有。下面是一個檔案的相關方法詳情:

?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 import java.io.File;/* * Copyright [2015] [Jeff Lee] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Jeff Lee * @since 2015-7-13 10:06:28 * File方法詳細使用 */public class FileMethodsT {         private static void fileData(File f) {        System.out.println(            " 絕對路徑:" + f.getAbsolutePath() +            "\n 可讀:" + f.canRead() +            "\n 可寫:" + f.canWrite() +            "\n 檔案名稱:" + f.getName() +            "\n 上級目錄:" + f.getParent() +            "\n 相對位址:" + f.getPath() +            "\n 長度:" + f.length() +            "\n 最近修改時間:" + f.lastModified()            );        if(f.isFile())            System.out.println(" 是一個檔案");        else if(f.isDirectory())            System.out.println(" 是一個目錄");    }         public static void main(String[] args) {        // 擷取src目錄        File file = new File("src");        // file詳細操作        fileData(file);    }}

在eclipse中,右鍵run一下,可以得到如下的結果:大家應該都明白了吧。

檔案如何過濾呢?

以後獨立講吧,過濾涉及Fiter類。

四、總結

1、看源碼很簡單,看資料結構。看如何調用。或者是有些設計模式

2、學東西,學一點一點深一點。太深不好,一點就夠了

3、泥瓦匠學習的代碼都在github上(同步osc git),歡迎大家點star,提意見,一起進步。地址:https://github.com/JeffLi1993

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

圖解 Java IO : 一、File源碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.