지금까지 연구한 스트림은 입출력 스트림이다.
읽기 또는 쓰기 요청을 운영 체제에서 요청하는 즉시 처리하는 것은 매우 비효율적입니다.
디스크 액세스나 네트워크 액세스와 같은 매우 시간 소모적인 작업이 필요하기 때문입니다.
이 오버헤드를 줄이기 위해 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를 입력하여 루프를 종료합니다.