-
앞서까지 배운 스트림은 입출력 스트림이였다.
read나 write 요청은 운영 체제에 의하여 요청되는 즉시 처리되는데 이와 같은 방법은 매우 비효율적이다.
디스크 접근이나 네트워크 접근과 같은 매우 시간이 많이 걸리는 동작을 요구하기 때문이다.
이러한 오버헤드를 줄이기 위하여 자바에서는 버퍼링된 스트림(buffered I/O)을 제공한다.
BufferedOutputStream 예제
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버퍼스트림 input, 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을 입력하면 반복문을 종료하게 된다.