본문 바로가기
IT & AI/AI 지식

JAVA 입출력 스트림, 보조 스트림, 파일 API 정리

by 빛나는해커 2024. 11. 23.

1.  입출력 스트림

  • 자바에서 데이터 입출력은 스트림(Stream)을 통해 이루어진다.
  • 스트림은 데이터를 연속적으로 읽고 쓰는 데 사용되는 흐름을 의미한다.
  • 입출력 스트림은 크게 바이트 스트림과 문자 스트림으로 나뉜다.
  • OutputStream은 바이트 단위의 데이터를 출력하기 위한 스트림이다.
  • 이 클래스는 파일이나 네트워크로 데이터를 보낼 때 사용되며, 다양한 하위 클래스들이 있다.
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
    String data = "Hello, Java!";
    fos.write(data.getBytes());
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서 FileOutputStream을 사용하여 문자열을 파일에 바이트 단위로 출력하고 있다.
  • InputStream은 바이트 단위의 데이터를 입력받기 위한 스트림이다.
  • 파일, 네트워크, 메모리 등에서 바이트 데이터를 읽을 수 있다.
try (FileInputStream fis = new FileInputStream("input.txt")) {
    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서 FileInputStream을 사용하여 파일에서 데이터를 읽고, 한 바이트씩 출력하고 있다.
  • Writer는 문자 데이터를 출력하기 위한 스트림이다.
  • 바이트 단위가 아닌 문자 단위로 데이터를 다루기 때문에 텍스트 데이터를 다룰 때 적합하다.
try (FileWriter writer = new FileWriter("output.txt")) {
    writer.write("Hello, Java!");
} catch (IOException e) {
    e.printStackTrace();
}
  • FileWriter를 사용하여 문자열을 파일에 문자 단위로 출력하고 있다.
  • Reader는 문자 데이터를 입력받기 위한 스트림이다.
  • 파일이나 다른 입력 소스로부터 텍스트를 읽는 데 사용된다.
try (FileReader reader = new FileReader("input.txt")) {
    int data;
    while ((data = reader.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  • FileReader를 사용하여 파일에서 문자 데이터를 읽고 출력하는 예제이다.

2.  보조 스트림

  • 보조 스트림은 기본 스트림에 추가적인 기능을 제공하기 위해 사용된다.
  • 보조 스트림은 기본 스트림과 연결하여 데이터의 필터링, 버퍼링, 변환 등의 기능을 제공한다.
try (FileInputStream fis = new FileInputStream("input.txt");
     BufferedInputStream bis = new BufferedInputStream(fis)) {
    int data;
    while ((data = bis.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서는 BufferedInputStream을 사용하여 FileInputStream에 버퍼링 기능을 추가하였다.
  • 이를 통해 입출력 성능을 향상시킬 수 있다.
  • InputStreamReader와 OutputStreamWriter는 바이트 스트림을 문자 스트림으로 변환하는 보조 스트림이다.
  • 이를 통해 바이트 데이터를 문자 데이터로 처리할 수 있다.
try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "UTF-8")) {
    int data;
    while ((data = isr.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 코드에서 InputStreamReader를 사용하여 바이트 데이터를 문자로 변환하고 UTF-8 인코딩을 지정하여 읽고 있다.
  • BufferedInputStream과 BufferedOutputStream은 데이터 입출력 시 버퍼링을 제공하여 성능을 향상시키는 보조 스트림이다.
  • 버퍼링을 통해 입출력 작업의 효율성을 크게 높일 수 있다.
  • DataInputStream과 DataOutputStream은 기본 타입 데이터를 읽고 쓸 수 있는 보조 스트림이다.
  • 이를 통해 intdoubleboolean 등의 기본 타입을 파일에 쉽게 저장하고 읽을 수 있다.
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
    dos.writeInt(100);
    dos.writeDouble(3.14);
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서 DataOutputStream을 사용하여 정수와 실수를 파일에 저장하고 있다.
  • PrintStream과 PrintWriter는 포맷된 문자열을 출력하기 위한 보조 스트림이다. 
  • println() 메소드를 통해 다양한 데이터 타입을 쉽게 출력할 수 있다.
try (PrintWriter pw = new PrintWriter(new FileWriter("output.txt"))) {
    pw.println("Hello, Java!");
    pw.printf("숫자: %d, 실수: %.2f%n", 100, 3.14);
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 코드에서 PrintWriter를 사용하여 문자열을 포맷하여 파일에 출력하고 있다.
  • ObjectInputStream과 ObjectOutputStream은 객체를 직렬화하여 파일에 저장하거나 읽어 들이는 보조 스트림이다.
  • 이를 통해 객체 자체를 입출력할 수 있다.
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
    oos.writeObject(new String("Hello, Java!"));
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서는 ObjectOutputStream을 사용하여 String 객체를 파일에 저장하고 있다.
  • 이때 객체는 직렬화가 가능해야 하며, 클래스는 Serializable 인터페이스를 구현해야 한다.

3. 입출력 관련 API

  • System.in은 표준 입력 스트림으로, 주로 콘솔로부터 입력을 받을 때 사용된다.
  • 기본적으로 바이트 스트림이기 때문에 문자 데이터를 처리하려면 InputStreamReader와 같은 보조 스트림을 사용해야 한다.
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
try {
    String input = br.readLine();
    System.out.println("입력된 값: " + input);
} catch (IOException e) {
    e.printStackTrace();
}
  • 위 예제에서는 BufferedReader를 사용하여 콘솔로부터 문자열을 입력받고 있다.
  • System.out은 표준 출력 스트림으로, 콘솔에 데이터를 출력할 때 사용된다. 
  • print()println() 메소드를 통해 다양한 데이터를 출력할 수 있다.
System.out.println("Hello, Java!");
System.out.printf("숫자: %d, 실수: %.2f%n", 100, 3.14);
  • 위 코드에서는 System.out을 사용하여 문자열을 출력하고 있다.
  • Scanner 클래스는 키보드로부터 입력을 쉽게 받을 수 있는 기능을 제공한다. 
  • System.in과 함께 사용하여 콘솔 입력을 처리한다.
Scanner scanner = new Scanner(System.in);
System.out.print("숫자를 입력하세요: ");
int number = scanner.nextInt();
System.out.println("입력된 숫자: " + number);
  • 위 예제에서 Scanner 클래스를 사용하여 사용자가 입력한 숫자를 처리하고 있다.
  • File 클래스는 파일과 디렉토리를 다루기 위한 기능을 제공한다.
  • 파일 생성, 삭제, 경로 확인 등 파일 시스템을 조작하는 다양한 메소드를 제공한다.
File file = new File("example.txt");
if (file.exists()) {
    System.out.println("파일이 존재합니다.");
} else {
    System.out.println("파일이 존재하지 않습니다.");
}
  • 위 코드에서 File 클래스를 사용하여 특정 파일이 존재하는지 확인하고 있다.

JAVA 기초 입출력 스트림, 보조 스트림, API 소개 이미지