Java IO 操作與字節流 簡述

File類

一個File類的對象,表示了磁盤上的文件或目錄。
File類提供了與平臺無關的方法來對磁盤上的文件或目錄進行操作


流式I/O

流(Stream)是字節的源或目的。
兩種基本的流是:輸入流(Input Stream)和輸出流(Output Stream)。可從中讀出一系列字節的對象稱爲輸入流。而能向其中寫入一系列字節的對象稱爲輸出流。
流的分類
節點流:從特定的地方讀寫的流類,例如:磁盤或一塊內存區域。
過濾流:使用節點流作爲輸入或輸出。過濾流是使用一個已經存在的輸入流或輸出流連接創建的。
InputStream
三個基本的讀方法
         abstract int read() 讀取一個字節數據,並返回讀到的數據,如果返回-1,表示讀到了輸入流的末尾。
         int read(byte[] b) : 將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。
         int read(byte[] b, int off, int len) :將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。
其它方法
         long skip(long n) :在輸入流中跳過n個字節,並返回實際跳過的字節數。
         int available() :返回在不發生阻塞的情況下,可讀取的字節數。
         void close() :關閉輸入流,釋放和這個流相關的系統資源。
         void mark(int readlimit) :在輸入流的當前位置放置一個標記,如果讀取的字節數多於readlimit設置的值,則流忽略這個標記。
         void reset() :返回到上一個標記。
         boolean markSupported() :測試當前流是否支持mark和reset方法。如果支持,返回true,否則返回false。
java.io包中 InputStream的類層次

OutputStream

三個基本的寫方法
        abstract void write(int b) :往輸出流中寫入一個字節。
        void write(byte[] b) :往輸出流中寫入數組b中的所有字節。
        void write(byte[] b, int off, int len) :往輸出流中寫入數組b中從偏移量off開始的len個字節的數據。
其它方法
        void flush() :刷新輸出流,強制緩衝區中的輸出字節被寫出。
        void close() :關閉輸出流,釋放和這個流相關的系統資源。

 

java.io包中 OutputStream的類層次


基本的流類


FileInputStream和FileOutputStream
       節點流,用於從文件中讀取或往文件中寫入字節流。如果在構造FileOutputStream時,文件已經存在,則覆蓋這個文件。


BufferedInputStream和BufferedOutputStream
       過濾流,需要使用已經存在的節點流來構造,提供帶緩衝的讀寫,提高了讀寫的效率。


DataInputStream和DataOutputStream
         過濾流,需要使用已經存在的節點流來構造,提供了讀寫Java中的基本數據類型的功能。


PipedInputStream和PipedOutputStream
       管道流,用於線程間的通信。一個線程的PipedInputStream對象從另一個線程的PipedOutputStream對象讀取輸入。要使管道流有用,必須同時構造管道輸入流和管道輸出流。


Java I/O庫的設計原則
Java的I/O庫提供了一個稱做鏈接的機制,可以將一個流與另一個流首尾相接,形成一個流管道的鏈接。這種機制實際上是一種被稱爲Decorator(裝飾)設計模式的應用。
通過流的鏈接,可以動態的增加流的功能,而這種功能的增加是通過組合一些流的基本功能而動態獲取的。
我們要獲取一個I/O對象,往往需要產生多個I/O對象,這也是Java I/O庫不太容易掌握的原因,但在I/O庫中Decorator模式的運用,給我們提供了實現上的靈活性。
I/O流的鏈接
Reader和Writer
Java程序語言使用Unicode來表示字符串和字符。
Reader和Writer這兩個抽象類主要用來讀寫字符流。
java.io包中Reader的類層次
java.io包中Writer的類層次


字符集的編碼
ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼),是基於常用的英文字符的一套電腦編碼系統。我們知道英文中經常使用的字符、數字符號被計算機處理時都是 以二進制碼的形式出現的。這種二進制碼的集合就是所謂的ASCII碼。每一個ASCII碼與一個8位(bit)二進制數對應。其最高位是0,相應的十進制 數是0-127。如,數字“0”的編碼用十進制數表示就是48。另有128個擴展的ASCII碼,最高位都是1,由一些製表符和其它符號組成。ASCII 是現今最通用的單字節編碼系統。
GB2312:GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集-基本 集》。主要用於給每一箇中文字符指定相應的數字,也就是進行編碼。一箇中文字符用兩個字節的數字來表示,爲了和ASCII碼有所區別,將中文字符每一個字 節的最高位置都用1來表示。
GBK:爲了對更多的字符進行編碼,國家又發佈了新的編碼系統GBK(GBK的K是“擴展”的漢語拼音第一個字母)。在新的編碼系統裏,除了完全兼容GB2312 外,還對繁體中文、一些不常用的漢字和許多符號進行了編碼。
ISO-8859-1:是西方國家所使用的字符編碼集,是一種單字節的字符集 ,而英文實際上只用了其中數字小於128的部分。

 


字符集的編碼
Unicode:這是一種通用的字符集,對所有語言的文字進行了統一編碼,對每一個字符都用2個字節來表示,對於英文字符采取前面加“0”字節的策略實現等長兼容。如 “a” 的ASCII碼爲0x61,UNICODE就爲0x00,0x61。
UTF- 8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集標準的一個超集)。一個7位的ASCII碼值,對應的UTF碼是一個字節。如果字符是0x0000,或在0x0080與0x007f之 間,對應的UTF碼是兩個字節,如果字符在0x0800與0xffff之間,對應的UTF碼是三個字節。
RandomAccessFile
RandomAccessFile類同時實現了DataInput和DataOutput接口,提供了對文件隨機存取的功能,利用這個類可以在文件的任何位置讀取或寫入數據。
RandomAccessFile類提供了一個文件指針,用來標誌要進行讀寫操作的下一數據的位置。

 


對象序列化
將對象轉換爲字節流保存起來,並在日後還原這個對象,這種機制叫做對象序列化。
將一個對象保存到永久存儲設備上稱爲持續性。
一個對象要想能夠實現序列化,必須實現Serializable接口或Externalizable接口。

 


對象序列化
當一個對象被序列化時,只保存對象的非靜態成員變量,不能保存任何的成員方法和靜態的成員變量。
如果一個對象的成員變量是一個對象,那麼這個對象的數據成員也會被保存。
如果一個可序列化的對象包含對某個不可序列化的對象的引用,那麼整個序列化操作將會失敗,並且會拋出一個NotSerializableException。我們可以將這個引用標記爲transient,那麼對象仍然可以序列化。

 


總結
InputStream和OutputStream:字節流的輸入輸出。
Reader和Writer:字符流的輸入輸出。
流的鏈接(Java I/O庫的設計原則)

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1447
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章