プログラミング自主学習 DAY78 Buffered Stream

2023/08/13に公開

はじめに

これから、勉強のまとめだけでなく、情報発信といった目的にも力を入れてまいりたいと思うので、丁寧語と話し言葉で記事を作成することにしました。
どうぞよろしくお願いいたします。

I/O Stream

https://zenn.dev/eldorado215/articles/207577a50ecafb
https://zenn.dev/eldorado215/articles/cd58c68d9dd156
https://zenn.dev/eldorado215/articles/b55a7d2fd56b9c

3日間、バイトストリーム(FileOutputStream, FileInputStream
文字ストリーム(FileWriter, FileReader)について勉強しました。

今まで勉強した、I/O系のストリームは、HDDに直接つながるストリームです。
しかし、この場合は、プレセス上、効率が良いとは言いづらいです。

簡単に説明すれば、I/O作業の場合、我々はパソコンはすべてのプロセスを待機状態に回し、I/Oをするイベントに受け入れることになります。

OS/Context Switch, interruptなどの話に繋がるが、詳しい説明は本記事では扱いません。

機械装置であるHDDと電気でデーターを交換するRAMの間は、必然的にボトルネック現象という現象が起きます。そのスピードの差を埋めるため、Bufferというデーターの臨時空間に保存し、埋まったら一機にflush(排出)することができます。
Bufferedというストリームもこのような原理から作られ、I/Oのスペードが上がります。

BufferedI/O Stream

Bufferingを利用したBufferedInputStreamBufferedOutputStreamは圧倒的なスピードの差があります。Buffred I/O Streamを宣言する際には、まずFileInputStreamとFileOutputStreamのオブジェクトが必要になるので、パラメーターからFileInputStream・FileOutStreamのオブジェクトを生成し、そのコンストラクタのオブジェクトに経路を入れることで変数を減らし、メモリを制約しましょう。

import java.io.*;

public class BufferExample {
public static void main(String[] args) throws IOException {
		
//FileI/O
String originalFilePath1 = BufferExample.class.getResource("originalFile1.jpg").getPath();
String targetFilePath1   = "C:/tmp/targetFile1.jpg";
		
FileInputStream fis = new FileInputStream(originalFilePath1);
FileOutputStream fos = new FileOutputStream(targetFilePath1);
		
//BufferedI/O
String originalFilePath2 = BufferExample.class.getResource("originalFile2.jpg").getPath();
String targetFilePath2 = "C:/tmp/targetFile2.jpg";
		
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(originalFilePath2));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFilePath2));
		
//without Buffered
long nonBufferTime = copy(fis,fos);
System.out.println("without Buffered:" + nonBufferTime + "ns" );
		
//use Buffered
long bufferTime = copy(bis,bos);
System.out.println("Buffered:\t" + bufferTime + "ns" );
	
fis.close();
fos.close();
bis.close();
bos.close();
}

public static long copy(InputStream is, OutputStream os) throws IOException {
		
long start = System.nanoTime();
		
int data;
while((data = is.read()) != -1 ) {
	os.write(data);
   }
os.flush();
		
long end = System.nanoTime();
		
return (end-start);
}
	
}

without Buffered:2837605300ns
Buffered:	13524400ns

Discussion