JDKフレームワークの概要--java.ioパッケージの入出力クラスライブラリ


に記入
JDK,Java Development Kit.
まず、JDKはJavaベースクラスライブラリのセットにすぎず、Sun社が開発したベースクラスライブラリであることを認識しなければなりません.それだけです.JDK自体と私たちが自分でまとめたクラスライブラリは、技術的な含有量から言えば、やはり1つのレベルで、バイトコードにコンパイルされ、JREで実行される必要があります.JDKコンパイル後の結果はjre/libのrt.jarです.Javaに対する理解を深め、Java符号化のレベルを高めることを目的としています.
本シリーズのすべての文章に基づいたJDKバージョンは1.7である.16.
ソースのダウンロードアドレス:https://jdk7.java.net/source.html
本節の内容
Java IOライブラリは、1つのストリームを別のストリームのヘッダと接続し、1つのストリームパイプのリンクを形成することができるリンクと呼ばれるメカニズムを提供しています.このメカニズムは実際には装飾モード(Decorator)の応用である.
ストリームのリンクによって、ストリームの機能を動的に増加させることができ、この機能の増加は、いくつかのストリームの基本的な機能を動的に組み合わせて取得される.
1つの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は主に文字の読み書きに使用されます.
オブジェクトのシーケンス化
オブジェクトをバイトストリームに変換して保存し、後でこのオブジェクトを復元するメカニズムをオブジェクトシーケンス化と呼びます.
永続化と呼ばれるオブジェクトを永続化ストレージデバイスに保存します.
1つのオブジェクトがシーケンス化を実現するにはjavaを実現する必要がある.io.Serializableインタフェース、このインタフェースは宣言式インタフェースで、何もありません.コンパイラにオブジェクトがシーケンス化できることを伝えます.
オブジェクトがシーケンス化されると、そのオブジェクトの非静的メンバー変数のみが保持され、メンバーメソッドと静的メンバー変数は保存されません.
オブジェクトのメンバー変数がオブジェクトである場合、そのオブジェクトのデータ・メンバーも保存されます.
シーケンス可能なオブジェクトにシーケンス不可能なオブジェクトのメンバー変数への参照が含まれている場合、シーケンス化操作全体が失敗し、javaという例外が放出されます.io.NotSerializableException.この参照をtransientとマークすると、このオブジェクトもシーケンス化できます.transientキーワードでタグ付けされた変数は、シーケンス化時に破棄されるためです.
serialVersionUID
Javaのシーケンス化メカニズムは,実行時にクラスのserialVersionUIDを判断することによってバージョン整合性を検証する.
(1)Serializableインタフェースを実現したオブジェクトは,serialVersionUIDを設定した値を表示できる(JDKソースコードではそうする).
(2)serialVersionUIDの値を設定しなくてもよい.この場合、Javaシーケンス化メカニズムは、コンパイルされたclass(クラス名、メソッド名など多くの要因により計算され、理論的には1つ1つのマッピングの関係、すなわち唯一)に基づいて自動的に1つのserialVersionUIDをシーケンス化バージョンとして生成して比較する.この場合、classファイル(クラス名、メソッドなど)変化なし、スペース、改行、コメントを増やすことは可能ですが、複数回コンパイルしてもserialVersionUIDは変化しません.メソッド、変数などを追加すると、java.io.InvalidClassExceptionという異常が報告されます
(3)日常生産では、private static final long serialVersionUID=1 Lを設定することがよくあります.この場合、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の利点の1つは、大量の入出力に基づいてI/Oを同時に実行できることです.同期プログラムは、ポーリングを支援するか、大量の接続を処理するために多くのスレッドを作成する必要があることが多い.
非同期I/Oを使用すると、ポーリングや追加のスレッドを使用せずに、任意の数のチャネル上のイベントをリスニングできます.
しばらくはまだよく研究していないので、いくつかの文章を記録します.
http://blog.csdn.net/kobejayandy/article/details/11545057
http://news.cnblogs.com/n/205413/
http://weixiaolu.iteye.com/blog/1479656
http://www.iteye.com/topic/834447
http://blog.csdn.net/anders_zhuo/article/details/8535719