InputStream과 BufferedInputStream의 차이점 및 성능비교
InputStream클래스는 abstract 클래스이므로 직접 인스턴스를 생성하여 사용할 수 없지만, BufferedInputStream은 온전한 클래스이기 때문에 직접 인스턴스를 생성하고 사용할 수 있는 점이 다르며,
InputStream은 노드 스트림이기 때문에 데이터의 소스에 직접 연결되고 BufferedInputStream은 필터스트림이기 때문에 다른 InputStream과 연결되는 점이 또한 다르다.
성능면에서는 BufferedInputStream 은 데이터를 읽어오는 작업을 수행시 미리 버퍼에 데이터를 복사해놓는 방법을 이용하므로 read() 를 호출하기 전에 읽어 올 데이터가 준비되어 있어서 read() 호출할 때 즉시 리턴되는 점이 다르다
아래의 코드는 기본 FileInputStream을 이용하여 파일을 복사하는데 소요되는 시간과 BufferedInputStream을 사용하여 동일한 작업을 수행하는데 소요된 시간을 비교하기 위해 작성한 예제이다
private void basicStream() {
FileInputStream fin = null;
FileOutputStream fout = null;
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
fin = new FileInputStream("d:/test/sample.jpg");
fout = new FileOutputStream("d:/test/imgCpy.jpg");
byte[] buf = new byte[256];
int read = 0;
long start = System.currentTimeMillis();
while((read=fin.read(buf, 0, buf.length))!=-1) {
fout.write(buf, 0, read);
}
long end = System.currentTimeMillis();
fin.close();
fout.close();
System.out.println("기본 스트림, 이미지 파일복사 완료("+(end-start)+")");
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void filterStream() {
FileInputStream fin = null;
FileOutputStream fout = null;
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
fin = new FileInputStream("d:/test/sample.jpg");
bin = new BufferedInputStream(fin);
fout = new FileOutputStream("d:/test/imgCpy.jpg");
bout = new BufferedOutputStream(fout);
byte[] buf = new byte[256];
int read = 0;
long start = System.currentTimeMillis();
while((read=bin.read(buf, 0, buf.length))!=-1) {
bout.write(buf, 0, read);
}
long end = System.currentTimeMillis();
bin.close();
bout.close();
System.out.println("필터스트림, 이미지 파일복사 완료("+(end-start)+")");
} catch (Exception ex) {
ex.printStackTrace();
}
}