Java IO相關API概覽

文件相關的概念

全部文件都是二進制保存的。html

可是爲了處理數據,高級語言引入了數據類型的概念,文件處理也是相似,全部文件都是以二進制形式保存的,可是爲了便於理解和處理文件,文件也有「文件類型」的概念,如pdf,jpg,zip。每種文件類型都有必定的格式,表明值文件含義和二進制之間的映射關係。java

文件類型能夠粗略地分爲兩類:

文本文件:.txt,.java,.html等數組

二進制文件:.zip,.pdf,.mp3等網絡

Java文件概述

在Java中,文件通常不是單獨處理的,而是視爲輸入輸出流。輸入流就是能夠從中獲取數據,輸入流的實際提供者可使鍵盤、文件、網絡。輸出流就是能夠向其中寫入數據,輸出流的實際目的地可使顯示終端、文件、網絡。異步

Java IO的基本類大多位於java.io包中。InputStream表示輸入流,OutputStream表示輸出流。性能

基本的字節流按字節讀寫,沒有緩衝區,這不方便使用,Java解決這個問題的方法是使用裝飾器模式,引入了不少裝飾類,對基本的流增長功能,以方便使用,通常一個類只關注一個方面,實際使用時,常常會須要多個裝飾類。編碼

Java中有不少裝飾類,有兩個基類:操作系統

過濾器輸入流FilterInputStreamhtm

和過濾器輸出流FilterOutputStream,對象

所謂過濾,就相似於自來水管道,流入的是水,流出的也是水,功能不變,或者只是增長功能,它有不少子類,這裏列舉一些:

對流起緩衝裝飾的子類是BufferedInputStream和BufferedOutputStream。

能夠按八種基本類型和字符串對流進行讀寫的子類是DataInputStream和DataOutputStream。

能夠對流進行壓縮和解壓縮的子類有GZIPInputStream, ZipInputStream, GZIPOutputStream, ZipOutputStream。

能夠將基本類型、對象輸出爲其字符串表示的子類有PrintStream。

Reader/Writer

以InputStream/OutputStream爲基類的流基本都是以二進制形式處理數據的,不可以方便的處理文本文件,沒有編碼的概念,可以方便的按字符處理文本數據的基類是Reader和Writer,它也有不少子類:

讀寫文件的子類是FileReader和FileWriter。

起緩衝裝飾的子類是BufferedReader和BufferedWriter。

將字符數組包裝爲Reader/Writer的子類是CharArrayReader和CharArrayWriter。

將字符串包裝爲Reader/Writer的子類是StringReader和StringWriter。

將InputStream/OutputStream轉換爲Reader/Writer的子類是InputStreamReader OutputStreamWriter。

將基本類型、對象輸出爲其字符串表示的子類PrintWriter。

File

上面介紹的都是操做數據自己,而關於文件路徑、文件元數據、文件目錄、臨時文件、訪問權限管理等,Java使用File這個類來表示。

NIO

NIO表明一種不一樣的看待IO的方式,它有緩衝區和通道的概念,利用緩衝區和通道每每能夠達成和流相似的目的,不過,它們更接近操做系統的概念,某些操做的性能也更高。好比,拷貝文件到網絡,通道能夠利用操做系統和硬件提供的DMA機制(Direct Memory Access,直接內存存取) ,不用CPU和應用程序參與,直接將數據從硬盤拷貝到網卡。

除了看待方式不一樣,NIO還支持一些比較底層的功能,如內存映射文件、文件加鎖、自定義文件系統、非阻塞式IO、異步IO等。

序列化和反序列化

簡單來講,序列化就是將內存中的Java對象持久保存到一個流中,反序列化就是從流中恢復Java對象到內存。序列化/反序列化主要有兩個用處,一個是對象狀態持久化,另外一個是網絡遠程調用,用於傳遞和返回對象。

Java主要經過接口Serializable和類ObjectInputStream/ObjectOutputStream提供對序列化的支持,基本的使用是比較簡單的,但也有一些複雜的地方。

不過,Java的默認序列化有一些缺點,好比,序列化後的形式比較大、浪費空間,序列化/反序列化的性能也比較低,更重要的問題是,它是Java特有的技術,不能與其餘語言交互。

XML是前幾年最爲流行的描述結構性數據的語言和格式,Java對象也能夠序列化爲XML格式,XML容易閱讀和編輯,且能夠方便的與其餘語言進行交互。

XML強調格式化但比較"笨重",JSON是近幾年來逐漸流行的輕量級的數據交換格式,在不少場合替代了XML,也很是容易閱讀和編輯,Java對象也能夠序列化爲JSON格式,且與其餘語言進行交互。

XML和JSON都是文本格式,人容易閱讀,但佔用的空間相對大一些,在只用於網絡遠程調用的狀況下,有不少流行的、跨語言的、精簡且高效的對象序列化機制,如ProtoBuf, Thrift, MessagePack等。MessagePack是二進制形式的JSON,更小更快。

相關文章
相關標籤/搜索