全部文件都是二進制保存的。html
可是爲了處理數據,高級語言引入了數據類型的概念,文件處理也是相似,全部文件都是以二進制形式保存的,可是爲了便於理解和處理文件,文件也有「文件類型」的概念,如pdf,jpg,zip。每種文件類型都有必定的格式,表明值文件含義和二進制之間的映射關係。java
文本文件:.txt,.java,.html等數組
二進制文件:.zip,.pdf,.mp3等網絡
在Java中,文件通常不是單獨處理的,而是視爲輸入輸出流。輸入流就是能夠從中獲取數據,輸入流的實際提供者可使鍵盤、文件、網絡。輸出流就是能夠向其中寫入數據,輸出流的實際目的地可使顯示終端、文件、網絡。異步
Java IO的基本類大多位於java.io包中。InputStream表示輸入流,OutputStream表示輸出流。性能
基本的字節流按字節讀寫,沒有緩衝區,這不方便使用,Java解決這個問題的方法是使用裝飾器模式,引入了不少裝飾類,對基本的流增長功能,以方便使用,通常一個類只關注一個方面,實際使用時,常常會須要多個裝飾類。編碼
Java中有不少裝飾類,有兩個基類:操作系統
過濾器輸入流FilterInputStreamhtm
和過濾器輸出流FilterOutputStream,對象
所謂過濾,就相似於自來水管道,流入的是水,流出的也是水,功能不變,或者只是增長功能,它有不少子類,這裏列舉一些:
對流起緩衝裝飾的子類是BufferedInputStream和BufferedOutputStream。
能夠按八種基本類型和字符串對流進行讀寫的子類是DataInputStream和DataOutputStream。
能夠對流進行壓縮和解壓縮的子類有GZIPInputStream, ZipInputStream, GZIPOutputStream, ZipOutputStream。
能夠將基本類型、對象輸出爲其字符串表示的子類有PrintStream。
以InputStream/OutputStream爲基類的流基本都是以二進制形式處理數據的,不可以方便的處理文本文件,沒有編碼的概念,可以方便的按字符處理文本數據的基類是Reader和Writer,它也有不少子類:
讀寫文件的子類是FileReader和FileWriter。
起緩衝裝飾的子類是BufferedReader和BufferedWriter。
將字符數組包裝爲Reader/Writer的子類是CharArrayReader和CharArrayWriter。
將字符串包裝爲Reader/Writer的子類是StringReader和StringWriter。
將InputStream/OutputStream轉換爲Reader/Writer的子類是InputStreamReader OutputStreamWriter。
將基本類型、對象輸出爲其字符串表示的子類PrintWriter。
上面介紹的都是操做數據自己,而關於文件路徑、文件元數據、文件目錄、臨時文件、訪問權限管理等,Java使用File這個類來表示。
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,更小更快。