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

최재원's avatar
Feb 20, 2025
[JAVA] 18. 파일 I/O with Buffer

1. 스트림

System.in → InputStream

package ex18; import java.io.IOException; import java.io.InputStream; public class Buff01 { public static void main(String[] args) { InputStream in = System.in; // 키보드 -> os -> System.in 으로 1Byte씩 받을 수 있는 선 try { int r = in.read(); // 키보드 입력 대기 System.out.println(r); // 1Byte만 받기 때문에 글자 1개만 받을 수 있다 } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image
  • 입력된 첫 번째 값만 읽는다
  • 2진 데이터를 정수값으로 변환해서 읽는다

InputStreamReader

package ex18; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Buff02 { public static void main(String[] args) { InputStream in = System.in; // 키보드 -> os -> System.in 으로 1Byte씩 받을 수 있는 선 InputStreamReader rd = new InputStreamReader(in); // 1Byte씩 받는 데이터를 char로 캐스팅한다. 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); } } }
notion image
notion image
  • 지정한 버퍼의 크기 만큼만 데이터를 받는다.
  • 정수를 문자로 캐스팅 해준다.

BufferedReader

package ex18; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Buff03 { public static void main(String[] args) { // InputStream in = System.in; // InputStreamReader rd = new InputStreamReader(in); // BufferedReader br = new BufferedReader(rd); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 자동으로 가변버퍼를 만들어 준다. char[] -> ArrayList -> String try { String line = br.readLine(); System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image
  • 가변 버퍼를 만들어 데이터를 읽는다.
  • \n 까지의 문자를 받아 문자열로 읽는다.

BufferedWriter

package ex18; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; // 버퍼는 꽉 차야 전송됨 // 프로토콜 : "\n" <- 기호를 메시지의 종단에 포함을 시켜야 읽는 쪽에서 사용가능 // data -> writerBuffer -> flush -> readerBuffer -> data public class Buff04 { 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); } } }
notion image
  • 버퍼는 꽉 차면 자동으로 흘러간다
  • 꽉 차지 않고 보내려면 flush 메서드를 사용한다
  • 보낸 데이터 종단에 \n이 없으면 읽을 수 없다.
  • out 은 모니터 출력을 의미한다.
  • out buffer를 만들어서 글자를 입력한다.

PrintWriter & Scanner

package ex18; import java.io.PrintWriter; import java.util.Scanner; public class Buff05 { public static void main(String[] args) { PrintWriter out = new PrintWriter(System.out, true); out.println("hello world"); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); System.out.println(str); } }
notion image
  • BufferedWriter를 사용하기 쉽게 만들어 준 클래스
  • 아직은 사용하지 말자!

2. 예제

파일 읽기(15-1)

package ex18; import java.io.FileReader; import java.io.IOException; public class FileReaderEx01 { public static void main(String[] args) { try { FileReader fr = new FileReader("test.txt"); int ch; // fr버퍼에서 내용을 읽었을때, 내용이 없으면 -1을 읽음 (그때 while 종료하면 됨) while ((ch = fr.read()) != -1) { System.out.println((char) ch); } fr.close(); // 스트림이 끝나면 반드시 닫아야한다. } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image
  • 한글이나 영문이 모두 2바이트 문자(유니코드)로 출력되고 있다.
  • 버퍼로 데이터를 받다가 끝나면 반드시 연결을 끊어야한다.
package ex18; import java.io.*; public class FileReaderEx01 { public static void main(String[] args) { try { BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream("test.txt")) ); String line = br.readLine(); System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
  • FileInputStream 클래스로 파일을 스트림 데이터로 만들어 읽는다.

파일 복사하기(15-2)

package ex18; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class FileReaderEx04 { public static void main(String[] args) { try { FileReader in = new FileReader("test.txt"); FileWriter out = new FileWriter("copy.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image
package ex18; import java.io.*; public class FileReaderEx03 { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"))); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy.txt"))); String m = br.readLine() + "\n"; bw.write(m); bw.flush(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image

바이트 스트림(15-3)

이진 파일 쓰기

package ex18; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileStreamTest { public static void main(String[] args) { byte[] list = {10, 20, 30, 40, 50, 60}; try { FileOutputStream out = new FileOutputStream("test.bin"); for (byte b : list) { out.write(b); } } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image

이진 파일 읽기

package ex18; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileStreamTest2 { public static void main(String[] args) { byte[] list = new byte[6]; try { FileInputStream in = new FileInputStream("test.bin"); in.read(list); } catch (Exception e) { throw new RuntimeException(e); } for (byte b : list) { System.out.print(b + " "); } } }
notion image

이미지 파일 복사하기

package ex18; import java.io.*; import java.util.Scanner; public class ByteStreamsLab { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("원본 파일 이름을 입력하시오: "); String inputFileName = sc.next(); System.out.println("복사 파일 이름을 입력하시오: "); String outputFileName = sc.next(); try { InputStream inputStream = new FileInputStream(inputFileName); OutputStream outputStream = new FileOutputStream(outputFileName); int c; while ((c = inputStream.read()) != -1) { System.out.println(c); outputStream.write(c); } } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } System.out.println(inputFileName + "을 " + outputFileName + "으로 복사하였습니다."); } }
notion image
  • FileInputStream & FileOutputStream 은 오라클에서 제공하는 클래스라 close()가 이미 구현되어 있다.

중간 처리 스트림(15-4)

이진수 저장 파일 읽기

package ex18; import java.io.*; public class DataStreamTest { public static void main(String[] args) { DataInputStream in = null; DataOutputStream out = null; try { out = new DataOutputStream(new FileOutputStream("data.in")); out.writeInt(123); out.writeFloat(123.456F); out.close(); in = new DataInputStream(new FileInputStream("data.in")); int aint = in.readInt(); float afloat = in.readFloat(); System.out.println(aint); System.out.println(afloat); in.close(); out.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image

버퍼 스트림

줄 단위 복사하기

package ex18; import java.io.*; public class CopyLines { public static void main(String[] args) { try { BufferedReader in = new BufferedReader(new FileReader("test.txt")); PrintWriter out = new PrintWriter(new FileWriter("output.txt")); String line; while ((line = in.readLine()) != null) { out.println(line); out.flush(); } } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image
 
Share article

jjack1