工做快3年了,老是爲了工做而工做,不少東西用的很熟練,但僅僅是知其然殊不知其因此然,再簡單體面的框架,工具,都離不開底層技術的支持,因此,帶着那顆初心,從新溫習一下java基礎部分,今天帶來的是IO流的解讀。java
廢話很少說,先上圖~數組
這是java io 比較基本的一些處理流,除此以外咱們還會提到一些比較深刻的基於io的處理類,好比console類,SteamTokenzier,Externalizable接口,Serializable接口等等一些高級用法極其原理。框架
雖然咱們此次的主角是IO流,可是流的本質實際上是對文件(File)的處理,所以,咱們按部就班一步一步從文件過渡到流去。工具
在java中File類是對文件和目錄路徑名的抽象表示,能夠經過其方法改變文件的屬性,可是不能夠更改文件中的具體內容。下面是java中對File類操做的一些經常使用方法:3d
①、建立方法對象
1.boolean createNewFile() 不存在返回true 存在返回false
2.boolean mkdir() 建立目錄,若是上一級目錄不存在,則會建立失敗
3.boolean mkdirs() 建立多級目錄,若是上一級目錄不存在也會自動建立blog
②、刪除方法繼承
1.boolean delete() 刪除文件或目錄,若是表示目錄,則目錄下必須爲空才能刪除
2.boolean deleteOnExit() 文件使用完成後刪除接口
③、判斷方法內存
1.boolean canExecute()判斷文件是否可執行
2.boolean canRead()判斷文件是否可讀
3.boolean canWrite() 判斷文件是否可寫
4.boolean exists() 判斷文件或目錄是否存在
5.boolean isDirectory() 判斷此路徑是否爲一個目錄
6.boolean isFile() 判斷是否爲一個文件
7.boolean isHidden() 判斷是否爲隱藏文件
8.boolean isAbsolute()判斷是不是絕對路徑 文件不存在也能判斷
④、獲取方法
1.String getName() 獲取此路徑表示的文件或目錄名稱
2.String getPath() 將此路徑名轉換爲路徑名字符串
3.String getAbsolutePath() 返回此抽象路徑名的絕對形式
4.String getParent()//若是沒有父目錄返回null
5.long lastModified()//獲取最後一次修改的時間
6.long length() 返回由此抽象路徑名錶示的文件的長度。
7.boolean renameTo(File f) 重命名由此抽象路徑名錶示的文件。
8.File[] liseRoots()//獲取機器盤符
9.String[] list() 返回一個字符串數組,命名由此抽象路徑名錶示的目錄中的文件和目錄。
10.String[] list(FilenameFilter filter) 返回一個字符串數組,命名由此抽象路徑名錶示的目錄中知足指定過濾器的文件和目錄。
對File的操做有了必定了解以後,咱們來聊一聊流的分類,根據側重點不一樣,有幾種不一樣的分類方式
1. 根據流向分爲輸入流和輸出流:
輸入流和輸出流是相對於程序而言的。
輸出:把程序(內存)中的內容輸出到磁盤、光盤等存儲設備中;
輸入:讀取外部數據(磁盤、光盤等存儲設備的數據)到程序(內存)中。
2.根據傳輸數據單位分爲字節流和字符流(代碼中能體現,不一樣的流有不一樣的實現類)
java中提供的字節流有OutputStream(輸出流),InPutStream(輸入流);字符流有Writer(輸出流),Reader(輸入流)。這四種也是 Java IO流中的四大基流。這四大基流都是抽象類,其餘流都是繼承於這四大基流的。 詳情可參考本文的第一張圖。
3.根據功能分爲節點流和包裝流(處理流)
節點流:能夠從或向一個特定的地方(節點)讀寫數據。如FileReader.
處理流:是對一個已存在的流的鏈接和封裝,經過所封裝的流的功能調用實現數據讀寫。如BufferedReader.處理流的構造方法老是要帶一個其餘的流對象作參數。一個流對象通過其餘流的屢次包裝,稱爲流的連接。
對幾種流的概念有了初步認識以後,來聊一聊流的執行流程
首先, 建立源或目標對象 ;輸入:把文件中的數據流向到程序中,此時文件是 源,程序是目標,輸出:把程序中的數據流向到文件中,此時文件是目標,程序是源;
接下來,建立 IO 流對象,輸入:建立輸入流對象,輸出:建立輸出流對象;
第三步, 具體的 IO 操做 ;
最後,關閉資源,輸入:輸入流的 close() 方法,輸出:輸出流的 close() 方法
注意:程序中打開的文件 IO 資源不屬於內存裏的資源,垃圾回收機制沒法回收該資源。若是不關閉該資源,那麼磁盤的文件將一直被程序引用着,不能刪除也不能更改。因此應該手動調用 close() 方法關閉流資源
只知道流的使用流程是遠遠不夠的,如何才能用java提供的相關工具類來靈活的使用IO流呢?下面,咱們會是一個漫長的溫習之旅,對java中提供的流的相關工具類來作個詳解。
1.字節輸入輸出流
在流的分類中,提到了OutputStream和InputStream兩個字節流(接口),此次,分別說說他們對應的一種實現類(FileOutputStream和FileInputStream)。
OutputStream(字節輸出流)的一些經常使用方法:
java中用FileOutputStream類來描述對OutputStream接口的實現:
InputStream(字節輸入流)的一些經常使用方法:
java中用FileInputStream類來描述對InputStream接口的實現:
最後用一個實用的小例子來鞏固一下對字節流的使用(文件的複製):
終於攻破了java給我提供的字節流實現類,趁熱打鐵,接下來在看看字符流的實現類。
2.字符輸入輸出流
字符輸出流:FileWriter的一些經常使用方法
java中用 FileWriter 類來描述對Writer接口的實現:
字符輸入流:FileReader的一些經常使用方法
java中用 FileReader 類來描述對Reader接口的實現:
最後用一個實用的小例子來鞏固一下對字符流的使用(文件的複製):
對於底層的IO字節字符流有了必定的認識後,能夠休息一會了!!!。。。。。。。。。。。。。。。。。。。。。
下節要說的是更高級的流,包裝流(流的分類中有提到),感謝閱讀~