blog

徹底分析:Javaのキャラクタ・ストリームとバイト・ストリーム、そしてキャッシュ・ストリーム。

ストリームは抽象的な概念であり、入力デバイスと出力デバイスを抽象化したもので、入力ストリームは入力チャネルとみなすことができ、出力ストリームは出力チャネルとみなすことができます。 入力ストリームは、プ...

Apr 1, 2020 · 6 min. read
シェア

どんな流れですか?

ストリームは抽象的な概念であり、入力および出力デバイスの抽象化であり、入力ストリームは入力チャネルとみなすことができ、出力ストリームは出力チャネルとみなすことができます。入力ストリームはプログラムに相対的であり、プログラムへの外部データは入力ストリームを使用する必要があります。出力ストリームは、プログラムに相対的であり、外部へのデータを転送するプログラムは、出力ストリームを使用する必要があります。

バイトストリームとは何ですか?

バイトストリーム-伝送中に転送されるデータの最も基本的な単位は、バイトのストリームです。

キャラクタ・ストリームとは何ですか?

キャラクタ・ストリーム - 送信中に転送されるデータの最も基本的な単位である文字のストリーム。

つまみの流れ

バイトストリーム用のクラスは、通常 stream で終わります。

一般的に使用されるバイト入力ストリームは次のとおりです: InputStream FileInputStream BufferedInputStream

使用法:TXTからテキスト情報をプリントアウトします:

コード

public class FileInputStreamDemo {
	public static void main(String[] args) {
		 InputStream is =null; 
		 try {
			 is = new FileInputStream(new File("E:/java /a.txt")); //このフォルダをメモリーに持つ必要がある
			 byte[] chars = new byte; //InputStreamDemoではbyteを使用する。
				int lenth = 0;	 
				while((lenth = is.read(chars))!=-1){ // .txt文字に読み込む
				String str = new String(chars,0,lenth); //バイト配列を文字列に変換するループ
				System.out.println(str);
				}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				is.close(); // 
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

走行結果

一般的に使用されるバイト出力ストリームは次のとおりです: OutputStream FileOutputStream BufferedOutputStream

使用法:文字列を TXT にプリントします:

public class Demo {
	//hello world. "というフレーズをテキストファイルに書く。
	public static void main(String[] args){
		OutputStream os = null;
		try {
			//1.ストリームオブジェクトを作成する
			File file = new File("E:/java /a.txt"); //このファイルが存在しない場合、自動的に作成される
			os = new FileOutputStream(file,true); //OutputStreamは抽象クラスであり、FileOutputStreamはサブクラスであり、パラメータはFile型である。
			String str = "hello world.";
			//2.書き込み操作のためにストリーム・オブジェクトのメソッドを呼び出す
			byte[] bytes = str.getBytes(); //文字列をバイト配列に変更する
			os.write(bytes); //バイトを.txtのバイト配列である。
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{			
			try {
				//3. 
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

走行結果

文字の流れ

一般的な文字入力ストリームは以下のとおりです:

Reader InputStreamReader FileReader BufferedReader

ご利用ください:

public class FileReaderDemo {
	public static void main(String[] args) {
		Reader r1 = null;
		try {
			r1 = new FileReader(new File("E:/java /a.txt"));
			char[] chars = new char; //文字の配列を定義する。文字は通常1024の倍数である。
			int length = 0;
			//ファイルの中身が大きいことは知られていないので、1024の出力を読むループを使えば、すべての
			while((length = r1.read(chars))!=-1){ // Length = r1.read(chars): r1の内容をcharsバイト配列に読み込む、戻り値はintである、ここでパラメータはchars型である、内容が-1に等しくないことは空でないことを示す
			String str = new String(chars,0,length); //文字配列の内容を文字列に変換する
			System.out.println(length+"--------"+str);
			}
		} catch (FileNotFoundException e) { //ファイルを読み込むための前提条件は、そのファイルが存在することで、そうでない場合は例外がスローされる
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				r1.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

走行結果

文字出力ストリーム

一般的な文字出力ストリームは以下の通りです:

ライタ OutputStreamWriter ファイルライタ BufferedWriter

使用法: ファイルに文字列を追加

public class FileWriteDemo { public static void main(String[] args) { Writer fw = null; try { //true表面文書にあるものは上書きされず、その後ろに書かれる fw = new FileWriter(new File("E:/java /a.txt"),true); fw.write("tanakasan lisi"); } catch (IOException e) { e.printStackTrace(); }finally{ try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }

走行結果

キャラクタ・キャッシュ・ストリーム

読み取り時間のFileReaderとFileWriterは、1回の読み取りまたは要求ディスクに1回書き込むので、時間の使用は非常に長く、効率が悪いので、読み取りと書き込みキャッシュとしてBufferedReaderとBufferedWriterの導入です。

1、BufferedReaderは一度に8K文字ストリームをメモリに読み込み、プログラムが文字を読み込むと、最初にBufferedReaderに読み込まれます。

2、書き込みバッファとしてBufferedWriterは、ファイルの文字ストリームをBufferedWriterに書き込むには、リフレッシュまたはディスクに書き込む前に、BufferedWriterを閉じて、ディスクの回数を減らす効率を向上させるために書き込まれます。

文字キャッシュ入力ストリーム:TXTからのデータをプログラムに追加します:

public class BufferedReaderDemo { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(new File("E:/java /a.txt"))); String str = null; while((str = br.readLine()) != null){ //readLine()一行ずつ読む System.out.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } }

文字キャッシュ出力ストリーム:文字列をTXTに出力します:

public static void main(String[] args) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(new File("E:/java /a.txt"),true)); //実際にストリームオブジェクトをラップする bw.newLine(); //空行を書く bw.write("こんにちは。"); } catch (IOException e) { e.printStackTrace(); }finally{ try { bw.flush(); //キャッシュされたデータをハードドライブにフラッシュする bw.close(); // } catch (IOException e) { e.printStackTrace(); } } }

例:a.txtからd.txtへデータをコピー コード:

public class BufferedInputStreamAndBufferedOutputSream {
	public static void main(String[] args) {
		//a.txtdにコピーする.txt
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			bis = new BufferedInputStream(new FileInputStream(new File("E:/java /a.txt"))); // 
			bos = new BufferedOutputStream(new FileOutputStream(new File("D:\\d.txt"))); // 
			byte[] bytes = new byte;
			int length = 0;
			while((length=bis.read(bytes))!=-1){
				bos.write(bytes, 0, length);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				bos.flush();
				bos.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

同じ関数のために今、操作クラスの2つのグループを使用することができますので、どのように正確に使用する方法の開発では、どちらが良いでしょうか?

結論

Read next

Kotlin上級 - ロジックを再利用してプロパティにアクセスする:デリゲート・プロパティ

p プロパティはアクセッサロジックを別のオブジェクトに委譲します。このオブジェクトにアクセスするには、キーワード by を使った式を評価します。 規約により、Delegate クラスは getValue メソッドと setValue メソッドを持たなければなりません (後者は mutable 属性の場合のみ...)。

Apr 1, 2020 · 4 min read