버퍼링된 스트림

지금까지 연구한 스트림은 입출력 스트림이다.

읽기 또는 쓰기 요청을 운영 체제에서 요청하는 즉시 처리하는 것은 매우 비효율적입니다.

디스크 액세스나 네트워크 액세스와 같은 매우 시간 소모적인 작업이 필요하기 때문입니다.

이 오버헤드를 줄이기 위해 Java는 버퍼링된 스트림(버퍼링된 I/O)을 제공합니다.

버퍼링된 출력 스트림 예

package ch05;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainTest1 {

	public static void main(String() args) {
		//기반스트림과 보조 스트림
		
		FileOutputStream fos = null;
		
		try {
			fos = new FileOutputStream("output3.txt");
			// 보조 스트림
			BufferedOutputStream bis = new BufferedOutputStream(fos);
			
			bis.write(97);
			bis.write(98);
			bis.write(99);
			bis.flush(); //물을 내리다.

} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //end of main } //end of class

출력 스트림을 버퍼 스트림 output()에 넣으면 output3.txt에 abc가 나타나는 것을 볼 수 있습니다.

zip 파일 복사(BufferedInputStream, BufferedOutputStream)

package ch05;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainTest3 {

	public static void main(String() args) {
		//기반스트림과 보조 스트림
		
		long millisecond = 0;
		
		//1
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream("bubble.zip");
			fos = new FileOutputStream("bubblecopy.zip");
			//보조 스트림 활용하기 !
!
//보조 스트림을 이용해서 읽어내면 걸리는 소요시간이 더 줄어든다.

BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); int i; millisecond = System.currentTimeMillis(); // 10 while((i= bis.read()) !
= -1) { bos.write(i); } // 20이 걸렸다고 하면 20 - 10 = 걸린시간을 알수 있다.

millisecond = System.currentTimeMillis() - millisecond; System.out.println("파일 복사시 소요시간 : "+millisecond); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } //end of main } //end of class

버퍼링된 스트림 입력, output()에 입력/출력 스트림을 넣어 zip 파일을 복사한 것을 볼 수 있습니다.

스캐너를 사용하다

package ch01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedreaderExample {

	public static void main(String() args) {
		//스트림 사용 -> 기반 + 보조
		//키보드에서 값 입력 받는거
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
//		System.out.print("입력 : ");
		try {
			String input = reader.readLine();
			System.out.println("input : " + input);
			// 메인 쓰레드가 일하고 있다.

while(input !
= null) { System.out.print("입력 : "); input = reader.readLine(); System.out.println("입력한 값 : " + input); } } catch (IOException e) { e.printStackTrace(); }finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } //end of main } //end of class

키보드로 입력한 값을 입력 스트림에 넣고, 입력한 값을 읽어주는 버터스트림으로 읽어들인다.

read() : 각 문자 읽기
readLine() : 한 줄의 텍스트 읽기

자동 차단

package ch01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class KeyboardToFileExample {

	public static void main(String() args) {
		
		//오토 클로즈 - 자동으로 리소스를 닫아 주는 녀석
		//불필요하게 닫아 주는 코드를 작성할 필요는 없다.

//식은 괄호 안에 작성해주면 된다.

- 닫아 줄 녀석들만 작성 try ( BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer = new BufferedWriter(new FileWriter("output3.txt")); ){ // 중괄호 안에는 수행 시킬 코드 작성 System.out.println("키보드로 입력 받아 데이터를 파일에다가 작성하기 "); String input = reader.readLine(); // true -> 부정 --> !
//사용자 입력 값이 quit 가아니라면 true 가 된다.

while( !
(input.equals("quit")) ) { // 파일에 글 작성 writer.write(input); writer.newLine(); // 키보드에서 데이터를 다시 입력 받기 input = reader.readLine(); } //quit -> 입력하게 되면 while 문 종료 한다.

System.out.println("출력이 완료되었습니다.

"); }catch (Exception e) { e.printStackTrace(); } } //end of main } //end of class

키보드로 입력한 값을 output3.txt로 출력하고 quit를 입력하여 루프를 종료합니다.