# 題記
JDK,Java Development Kit。
我們必須先認識到,JDK只是,僅僅是一套Java基礎類庫而已,是Sun公司開發的基礎類庫,僅此而已,JDK本身和我們自行書寫總結的類庫,從技術含量來說,還是在一個層級上,它們都是需要被編譯成字節碼,在JRE中運行的,JDK編譯后的結果就是jre/lib下的rt.jar,我們學習使用它的目的是加深對Java的理解,提高我們的Java編碼水平。
本系列所有文章基于的JDK版本都是1.7.16。
源碼下載地址:[https://jdk7.java.net/source.html](https://jdk7.java.net/source.html)
# 本節內容
Java IO庫提供了一個可以稱之為鏈接的機制,可以將一個流與另一個流首尾銜接,形成一個流管道的鏈接。這種機制實際上是裝飾模式(Decorator)的應用。
通過流的鏈接,可以動態的增加流的功能,而這種功能的增加,是通過動態的組合一些流的基本功能獲取的。
我們要獲取一個IO對象,往往要產生多個IO對象,這也是Java IO庫不太容易掌握的地方,但這種在IO庫中Decorator模式的運用,給我們提供了實現上的靈活性。
# 流的分類
節點流:從特定的地方讀寫的流類,比如磁盤或內存;比如FileInputStream/FileOutputStream就是節點流。
過濾流:使用節點流作為輸入輸出,提供功能的增強,繼承自FilterInputStream/FilterOututStream的類(比如DataInputStream提供讀寫Java基本數據類型的能力,BufferedInputStream提供數據緩存的能力)。
管道流:用于線程間的通信,比如PipedInputStream/PipedOutputStream。
演示一個功能增強的流程:
File ?--》FileInputStream(從文件中讀取字節) --》 BufferedInputStream(增加了緩沖功能)--》DataInputStream(增加了讀取Java基本數據類型的能力)--》數據
數據 --》DataInputStream(輸出流寫入Java基本類型)--》BufferedOutputStream(提供數據寫入緩沖區的功能)--》FileOutputStream(寫入文件)--》File
字節流和字符流:
Java語言使用Unicode來表示字符。
Reader和Writer主要用來讀寫字符。
# 對象序列化
將對象轉化為字節流保存起來,并在日后還原這個對象,這種機制叫做對象序列化。
將一個對象保存到永久存儲設備上,叫做持久化。
一個對象要想能夠實現序列化,必須實現java.io.Serializable接口,這個接口是一個聲明式接口,沒有任何內容,只是告訴編譯器,對象是可以序列化的。
當一個對象被序列化時,只保留這個對象的非靜態成員變量,不能保存任何成員方法和靜態的成員變量。
如果一個對象的成員變量是一個對象,那么這個對象的數據成員也會被保存。
如果一個可序列化的對象包含對某個不可序列化的對象的成員變量的引用,那么整個序列化操作會失敗,并且拋出一個異常:java.io.NotSerializableException。我們可以將這個引用標記為transient,那么這個對象也可以序列化。因為用transient關鍵字標記的變量,在序列化時,會被拋棄。
### serialVersionUID
Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。
(1)實現了Serializable接口的對象,可以顯示設置serialVersionUID的值(JDK源碼中就是這么干的)
(2)也可以不設置serialVersionUID的值,這時,Java序列化機制會根據編譯的class(它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的)自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名、方法等)沒有發生變化,增加空格、換行、注釋是可以的,編譯多次,serialVersionUID也不會變化的;如果增加了方法、變量等,則會報異常:java.io.InvalidClassException
(3)日常生產中,我們經常這么設置:private static final long serialVersionUID = 1L; 這時,Java序列化機制會認為版本是一致的,只會對能對照起來的變量進行賦值,對于類和序列化的數據中不一致的地方(比如序列化之后,類增加減少了字段),會直接拋棄
### 對象序列化代碼演示
~~~
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
public class Test {
public static void main(String[] args) throws Exception {
serial();
Person p = deserial();
System.out.println(p.getName());
System.out.println(p.getAge());
}
private static void serial() throws Exception {
Person p = new Person("zhangsan",18);
FileOutputStream fos = new FileOutputStream("/Users/puma/tt/person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.flush();
oos.close();
}
private static Person deserial() throws Exception{
FileInputStream fis = new FileInputStream("/Users/puma/tt/person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person)ois.readObject();
return p;
}
}
class Parent implements Serializable {}
class Person extends Parent {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
public Person(String name,Integer age) {
this.setName(name);
this.setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
~~~
# NIO
Java Non-blocking IO,很多著名的異步通信框架,比如Netty/Mina,都是基于NIO的,對性能大有提升。
異步 I/O 的一個優勢在于,它允許您同時根據大量的輸入和輸出執行 I/O。同步程序常常要求助于輪詢,或者創建許許多多的線程以處理大量的連接。
使用異步 I/O,您可以監聽任何數量的通道上的事件,不用輪詢,也不用額外的線程。
臨時還沒來得及仔細鉆研,記錄幾篇文章:
[http://blog.csdn.net/kobejayandy/article/details/11545057](http://blog.csdn.net/kobejayandy/article/details/11545057)
[http://news.cnblogs.com/n/205413/](http://news.cnblogs.com/n/205413/)
[http://weixiaolu.iteye.com/blog/1479656](http://weixiaolu.iteye.com/blog/1479656)
[http://www.iteye.com/topic/834447](http://www.iteye.com/topic/834447)
[http://blog.csdn.net/anders_zhuo/article/details/8535719](http://blog.csdn.net/anders_zhuo/article/details/8535719)
- 前言
- Java之旅--如何從草根成為技術專家
- 《深入理解Java虛擬機》學習筆記
- 《Spring3.X企業應用開發實戰》學習筆記--IoC和AOP
- 《Tomcat權威指南》第二版學習筆記
- Java之旅--多線程進階
- Java之旅--Web.xml解析
- 《Spring3.X企業應用開發實戰》學習筆記--DAO和事務
- 《Spring3.X企業應用開發實戰》學習筆記--SpringMVC
- Java之旅--定時任務(Timer、Quartz、Spring、LinuxCron)
- Spring實用功能--Profile、WebService、緩存、消息、ORM
- JDK框架簡析--java.lang包中的基礎類庫、基礎數據類型
- JDK框架簡析--java.util包中的工具類庫
- JDK框架簡析--java.io包中的輸入輸出類庫
- Java之旅--通訊
- Java之旅--XML/JSON
- Java之旅--Linux&java進階(看清操作系統層面的事)
- Java之旅--硬件和Java并發(神之本源)
- Java之旅--設計模式
- jetty