성능 향상 보조 스트림이란?

 : 프로그램의 성능은 입출력이 가장 늦은 장치를 따라가게 되는데요.

예를 들어서 CPU 랑 메모리의 성능이 아무리 좋다고 해도 하드 디스크의 입출력 늦다면

프로그램의 실행 성능은 하드 디스크의 처리 속도에 따라 맞춰갑니다.

네트워크도 느린 네트워크 환경이라면 컴퓨터의 성능이 좋더라도 메신저 또는 게임의 속도가 느려집니다.

이에 대한 완전한 해결책은 없는데요, 프로그램이 입출력 소스와 직접 작업하는 대신에

중간에 메모리 버퍼와 작업함으로써 실행 성능을 어느 정도 향상 시킬 수는 있습니다.

BufferedInputStream 과 BufferedOutputStream은 바이트 기반의 성능 향상 보조 스트림이고,

BufferedReader 와 BufferedWriter는 문자 기반 성능 향상 스트림입니다.

 

BufferedInputStream과 BufferedReader :

 BufferedInputStream은 바이트 입력 스트림에 연결되어서 버퍼를 제공해주는 보조 스트림입니다.

BufferedReader는 문자 입력 스트림에 연결되어서 버퍼를 제공해주는 스트림입니다.

 

위의 스트림은 둘 다 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장합니다.

생성자 매개값으로 준 입력 스트림과 연결되어 8918 내부 버퍼 사이즈를 갖습니다.

BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림); //  최대 8912 바이트

BufferedReader br = new BufferedReader(문자 입력 스트림); // 최대 8912 문자

 

스트림이 데이터를 읽어들이는 방법은 InputStream / Reader 와 갖습니다.

 

예제)

import java.io.BufferedInputStream;
import java.io.FileInputStream;


public class Example {
 public static void main(String[] args) throws Exception {
  long start = 0;
  long end = 0;
  
  FileInputStream fis1 = new FileInputStream("파일 경로/image.jpg");
  start = System.currentTimeMillis();
  while(fis1.read() != -1) {}
  end = System.currentTimeMillis();
  System.out.println("사용하지 않았을 때 걸린 시간: " + (end-start) + "ms");
  fis1.close();
  
  FileInputStream fis2 = new FileInputStream("C:/apache-tomcat-8.0.20/webapps/thisisjava/src/forest.jpg");
  BufferedInputStream bis = new BufferedInputStream(fis2);
  start = System.currentTimeMillis();
  while(bis.read() != -1) {}
  end = System.currentTimeMillis();
  System.out.println("사용했을 때 걸린 시간: " + (end-start) + "ms");
  bis.close();
  fis2.close();
 }
}
예제를 실행시켜보면 시간 차이가 꽤 많이 나는 것을 확인할 수 있습니다.


예제2)
예제2) BufferedReader / readLine()메서드를 추가적으로 가지고 있음. 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;


public class Example2 {
 public static void main(String[] args) throws Exception {  
  InputStream inputStream = System.in;
  Reader reader = new InputStreamReader(inputStream); 
  BufferedReader bufferedReader = new BufferedReader(reader);
  
  System.out.print("입력: ");
  String lineString = bufferedReader.readLine();
  
  System.out.println("출력: " + lineString); 
 }


}

BufferedOutPutStream :

바이트 출력 스트림에 연결되어서 버퍼를 제공해 주는 보조 스트림입니다.

BufferedWriter :

문자 출력 스트림에 연결되어 버퍼를 제공해주는 스트림입니다.

 

위 두 스트림은 프로그램에서 전송한 데이터를 내부에 두었다가 버퍼가 꽉 차면 버퍼의 모든

데이터들을 한번에 보냅니다.

BufferedOutputStream bufferedOutputStream

 = new BufferedOutputStream(바이트출력스트림); // 최대 8912바이트

BufferedWriter bufferedWriter

 = new BufferedWriter(문자출력스트림); // 최대 8912 문자

 

출력 방법은 OutputStream/ Writer 과 동일합니다.

예제)

성능차이를 보여주는 예제
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class Example {
 public static void main(String[] args) throws Exception {
  FileInputStream fileInputStream = null;
  FileOutputStream fileOutputStream = null;
  BufferedInputStream bufferedInputStream = null;
  BufferedOutputStream bufferedOutputStream = null;
  
  int data = -1;
  long start = 0;
  long end = 0;
  
  fileInputStream = new FileInputStream("파일 경로/image.jpg");
  bufferedInputStream = new BufferedInputStream(fis);
  fileOutputStream = new FileOutputStream("C:/Temp/forest.jpg");    
  start = System.currentTimeMillis();
  while((data = bufferedInputStream.read()) != -1) {
   fileOutputStream.write(data);
  }
  fileOutputStream.flush();
  end = System.currentTimeMillis();
  fileOutputStream.close();
  bufferedInputStream.close();
  fileInputStream.close();
  System.out.println("사용하지 않았을 때 걸린 시간: " + (end-start) + "ms");
  
  fileInputStream = new FileInputStream("C:/apache-tomcat-8.0.20/webapps/thisisjava/src/forest.jpg");
  bufferedInputStream = new BufferedInputStream(fis);
  fileOutputStream = new FileOutputStream("C:/Temp/forest.jpg");  
  BufferedOutputStream = new BufferedOutputStream(fileOutputStream);
  start = System.currentTimeMillis(); // 시작시간
  while((data = bufferedInputStream.read()) != -1) {
   BufferedOutputStream.write(data);
  }
  BufferedOutputStream.flush();
  end = System.currentTimeMillis(); // 종료시간
  BufferedOutputStream.close();
  fileOutputStream.close();
  bufferedInputStream.close(); 
  fileInputStream.close();
  System.out.println("사용했을 때 걸린 시간: " + (end-start) + "ms");
 }
}

 



출처: https://altongmon.tistory.com/274

반응형

'[ 개발 ] > Java' 카테고리의 다른 글

[Java] List와 ArrayList  (0) 2021.07.22
[Java] DataInputStream / DataOutputStream  (0) 2021.07.22
[Java] flush()와 close()  (0) 2021.07.22
[Java] 프로젝트에 이미지 폴더 넣는 방법  (0) 2021.04.16

+ Recent posts