JavaにおけるIOストリームの詳細分析


一、流れの概念
流れは字面から理解するのは1つの流れで、通常私达の言う水の流れ、川、すべて流れと呼ばれて、プログラム、ファイルとプログラムの间に1つのパイプを接続して、水の流れは间に形成して、自然に方向が现れました:流れて入ることができて、流出することができます.わかりやすいように、ストリームを定義します.ストリームは、ファイルとプログラムを接続したパイプラインに流れる水です.プログラムやプロセス間の通信、周辺機器、外部ファイルの読み書きなどを実現します.
二、流れの分類
これらの操作オブジェクトのタイプが文字かバイトかによって、文字ストリームとバイトストリームの2つのクラスに分けられます.全体の構造は以下の通りです.
三、バイトストリーム
1、バイト出力ストリームOutputStreamクラスはpublic abstract class OutputStream extends Object implements Closeableを定義し、Flushableこの抽象クラスは出力バイトストリームのすべてのクラスを表すスーパークラスである.出力ストリームは出力バイトを受け入れ、これらのバイトをInputStreamクラスのある受信機に送信してファイルに出力するには、FileOutputStreamクラスを使用します.
2、バイト入力フロー定義:public abstract class InputStream extends Object implements Closeableこの抽象クラスはバイト入力フローを表すすべてのクラスのスーパークラスである.FileInputStreamは、ファイルシステム内のファイルから入力バイトを取得します. 
四、文字の流れ
1、Writerは文字ストリームの抽象クラスを書き込む.サブクラスが実装しなければならない方法はwrite(char[],int,int),flush()およびclose()のみである.ただし、多くのサブクラスは、ここで定義したいくつかの方法を書き換えて、より効率的および/または他の機能を提供します.OutputStreamと同様に、ファイルの操作には:FileWriterクラスが完了します. 
2.Readerは、文字ストリームの抽象クラスを読み込むために使用されます.サブクラスが実装しなければならない方法はread(char[],int,int)とclose()のみである.ただし、多くのサブクラスは、ここで定義したいくつかの方法を書き換えて、より効率的および/または他の機能を提供します.FileReaderクラスを使用してインスタンス化します. 
五、緩衝流
ファイルや他のターゲットに対して頻繁な読み書き操作は、効率が低く、パフォーマンスが悪い.バッファフローを使用する利点は、データをバッファリングしてから一緒に書き込み、または読み出すことで、より効率的に情報を読み書きできることです. 
BufferedInputStream:別の入力ストリームにいくつかの機能を追加します.BufferedInputStreamを作成すると、データをバッファする内部バッファ配列が作成されます. 
BufferedOutputStream:このような出力ストリームを設定することで、アプリケーションは各バイトを最下位の出力ストリームに書き込むことができ、各バイトの書き込みに対して最下位のシステムを呼び出す必要はありません. 
BufferedReader:文字入力ストリームからテキストを読み込み、各文字をバッファリングし、文字、配列、行の効率的な読み取りを実現します. 
BufferedWriter:テキストを文字出力ストリームに書き込み、各文字をバッファリングし、単一の文字、配列、文字列の効率的な書き込みを提供します. 
六、印刷フロー
印刷ストリームの主な機能は出力であり、IOパッケージ全体で印刷ストリームは2種類に分けられる.
バイト印刷ストリーム:PrintStream PrintStream
文字印刷フロー:PrintWriter
印刷ストリームは簡単に出力できます
七、対象フロー
オブジェクトフローの2つのクラス:
ObjectOutputStream Javaオブジェクトの基本データ型とグラフィックをOutputStreamに書き込む
ObjectInputStreamは、以前にObjectOutputStreamを使用して書き込まれた基本データとオブジェクトを逆シーケンス化します.ここでは、オブジェクトをシーケンス化するときにserializableインタフェースを使用してシーケンス化可能としてマークすることに注意してください.
オクタバイト配列ストリーム
ByteArrayInputStreamには、ストリームから読み出されたバイトを含む内部バッファが含まれています.内部カウンタはreadメソッドが提供する次のバイトを追跡します.ByteArrayInputStreamを閉じるのは無効です.このようなメソッドは、IOExceptionを生成することなく、ストリームを閉じた後も呼び出されます. 
ByteArrayOutputStreamのような出力ストリームが実現され、byte配列にデータが書き込まれる.バッファは、データの書き込みに伴って自動的に増加します.toByteArray()とtoString()を使用してデータを取得できます.ByteArrayOutputStreamを無効にします.このようなメソッドは、IOExceptionを生成することなく、ストリームを閉じた後も呼び出されます. 
九、データフロー
DataInputStream:データ入力ストリームでは、アプリケーションがマシンに関係なく最下位の入力ストリームから基本的なJavaデータ型を読み込むことができます.アプリケーションは、データ出力ストリームを使用して、後でデータ入力ストリームによって読み出されるデータを書き込むことができます. 
DataInputStreamはマルチスレッドアクセスに対して必ずしも安全ではありません.スレッドセキュリティはオプションで、このような方法の使用者が担当します. 
DataOutputStream:データ出力ストリームでは、アプリケーションが基本的なJavaデータ型を出力ストリームに適切に書き込むことができます.その後、アプリケーションは、データ入力ストリームを使用してデータを読み込むことができます.  
十、文字ストリーム
StringReaderソースは文字列の文字ストリームです. 
StringWriterは、文字列バッファ内の出力を回収して文字列を構築する文字ストリームです.StringWriterを無効にします.このようなメソッドは、IOExceptionを生成することなく、ストリームを閉じた後も呼び出されます.
コピーファイルの例を簡単に挙げます.次のように、元のパスから読み込みながら、指定したパスに書き込みます.
package java_move;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class move {
	public static void main(String[] args)
	{
		String src="E:/DesktopFile/Android/CSDN.jpg";
		String target="E:/DesktopFile/Android/test/CSDN.jpg";
		copyFile(src,target);
	}
	public static void copyFile(String src,String target)
		{	
			File srcFile = new File(src);  
			   File targetFile = new File(target);  
			   try {  
			       InputStream in = new FileInputStream(srcFile);   
			       OutputStream out = new FileOutputStream(targetFile);  
			       byte[] bytes = new byte[1024];  
			       int len = -1;  
			       while((len=in.read(bytes))!=-1)
			       {  
			           out.write(bytes, 0, len);  
			       }  
			       in.close();  
			       out.close();  
			   } catch (FileNotFoundException e) {  
			       e.printStackTrace();  
			   } catch (IOException e) {  
			       e.printStackTrace();  
			   }  
			   System.out.println("      "); 

		}
			   
	}

まとめ:転送のタイプとフォーマットによって最も効率の高いストリームを選択して処理します.例えば、転送がテキストであると判断したら、文字ストリームを使います.データストリームを使います.データストリームを使います.また、クラシックな設計モードの装飾者の設計モードにも関連しています.時間があれば、把握してみてください.