[JAVA] 67. 파일 I/O with Buffer

문정준's avatar
Feb 19, 2025
[JAVA] 67. 파일 I/O with Buffer
입출력 스트림 (I/O Stream)은 모두 Byte Stream!!
입출력 시 모두 Buffer 사용
Buffer는 용량이 꽉 차거나, \n (엔터) 포함 시 flush
 

1. I/O Stream

  • 입출력 스트림은 Byte Stream과 Character Stream 두 가지를 사용
    • Character Stream도 Byte Stream
 

2. InputStream

  • 입력을 받는 입력 스트림을 구현하는 객체
  • 바이트로 전송하기 때문에 아스키 코드 (숫자)로 반환
package ex18; import java.io.IOException; import java.io.InputStream; public class Buffer01 { public static void main(String[] args) { // 시스템 Input을 받기 위한 객체 : InputStream InputStream in = System.in; try { // 키보드에서 입력받은 글자를 아스키 코드로 반환 int r = in.read(); System.out.println(r); } catch (IOException e) { throw new RuntimeException(e); } } }
 

3. InputStreamReader, BufferedReader

  • Character Stream을 사용하며, 문자를 자동 casting하고, ‘\n’을 확인하면 자동으로 파싱
  • InputStreamReader는 저장 공간이 고정되어 있음
  • BufferedReader는 저장 공간이 가변적임
package ex18; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Buffer02 { public static void main(String[] args) { InputStream in = System.in; InputStreamReader rd = new InputStreamReader(in); // 배열 : 고정 크기의 버퍼 char[] buf = new char[4]; try { // 키보드 입력 대기 rd.read(buf); System.out.println(buf[0]); System.out.println(buf[1]); System.out.println(buf[2]); System.out.println(buf[3]); } catch (IOException e) { throw new RuntimeException(e); } } }
package ex18; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Scanner; public class Buffer03 { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); /* 위의 코드는 아래 3줄의 코드를 1줄로 요약한 것 : 데코레이터 패턴 InputStream in = System.in; InputStreamReader rd = new InputStreamReader(in); BufferedReader br = new BufferedReader(rd); */ try { String line = br.readLine(); System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
 

4. OutputStreamWriter, BufferedWriter

  • 입력 스트림이 아닌 출력 스트림
  • Character Stream 사용
  • ‘\n’을 붙이지 않거나, 버퍼가 꽉 차지 않는다면 Flush 불가
    • flush() 메서드로 직접 flush 가능
package ex18; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; // 버퍼는 꽉 차야 전송됨 // 프로토콜 : '\n'을 함께 보내야 읽음 (엔터) public class Buffer04 { public static void main(String[] args) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { bw.write("안녕\n"); bw.flush(); } catch (IOException e) { throw new RuntimeException(e); } } }
 

5. 쉬운 Writer 및 Reader

  • PrintWriter : 출력 스트림을 사용하며, 버퍼가 꽉 차지 않더라도 자동 flush 가능
  • Scanner : 입력 스트림을 사용하며, 버퍼가 꽉 차지 않아도 ‘\n’을 확인해서 자동 파싱
package ex18; import java.io.PrintWriter; import java.util.Scanner; public class Buffer05 { public static void main(String[] args) { // PrintWriter : BufferedWriter에 AutoFlush 추가 PrintWriter out = new PrintWriter(System.out, true); out.println("Hello World"); // Scanner : BufferedReader Scanner in = new Scanner(System.in); String s = in.nextLine(); System.out.println(s); } }

1. Stream 예제
1. Stream 예제
Share article

sxias