본문 바로가기

IT · 인터넷

[Java] I/O 기본 개념 및 주요 클래스

반응형

 

Java에서 I/O(Input/Output)는 프로그램과 외부 세계(파일, 네트워크 등) 간의 데이터 전송을 의미합니다. 

Java는 다양한 I/O 작업을 수행하기 위해 여러 클래스를 제공합니다. 

이 글에서는 Java I/O의 기본 개념과 함께 InputStream, OutputStream, Reader, Writer 클래스에 대해 알아보겠습니다.

 

 

Java I/O의 기본 개념

  • 바이트 스트림 (Byte Stream): 바이트 단위로 데이터를 읽고 쓰는 스트림입니다.
    주로 이미지, 오디오, 비디오와 같은 바이너리 데이터를 처리할 때 사용됩니다.
  • 문자 스트림 (Character Stream): 문자 단위로 데이터를 읽고 쓰는 스트림입니다. 
    주로 텍스트 파일을 처리할 때 사용됩니다.

Java에서는 InputStream과 OutputStream 클래스를 통해 바이트 스트림을, Reader와 Writer 클래스를 통해 문자 스트림을 처리합니다.

 

#1 InputStream 클래스

InputStream은 바이트 단위로 데이터를 읽기 위한 추상 클래스입니다.

이 클래스를 상속받아 다양한 입력 스트림을 구현할 수 있습니다.

 

- 주요 서브클래스

  • FileInputStream: 파일에서 바이트 데이터를 읽기 위한 클래스입니다.
  • BufferedInputStream: 입력 스트림을 버퍼링하여 효율적으로 데이터를 읽기 위한 클래스입니다.

 

- 예제 

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("example.txt");
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data); // 바이트를 문자로 변환하여 출력
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close(); // 스트림 닫기
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

#2 OutputStream 클래스

OutputStream은 바이트 단위로 데이터를 쓰기 위한 추상 클래스입니다. 

이 클래스를 상속받아 다양한 출력 스트림을 구현할 수 있습니다. 

 

- 주요 서브클래스

  • FileOutputStream: 파일에 바이트 데이터를 쓰기 위한 클래스입니다.
  • BufferedOutputStream: 출력 스트림을 버퍼링하여 효율적으로 데이터를 쓰기 위한 클래스입니다.

 

- 예제

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("output.txt");
            String data = "Hello, World!";
            fos.write(data.getBytes()); // 문자열을 바이트 배열로 변환하여 파일에 쓰기
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close(); // 스트림 닫기
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

#3 Reader 클래스

Reader는 문자 단위로 데이터를 읽기 위한 추상 클래스입니다. 

이 클래스를 상속받아 다양한 문자 입력 스트림을 구현할 수 있습니다.

 

- 주요 서브클래스

  • FileReader: 파일에서 문자 데이터를 읽기 위한 클래스입니다.
  • BufferedReader: 입력 스트림을 버퍼링하여 효율적으로 데이터를 읽기 위한 클래스입니다.

 

- 예제

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class FileReaderExample {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("example.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line); // 한 줄씩 출력
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close(); // 스트림 닫기
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

#4 Writer 클래스

Writer는 문자 단위로 데이터를 쓰기 위한 추상 클래스입니다. 

이 클래스를 상속받아 다양한 문자 출력 스트림을 구현할 수 있습니다.

 

- 주요 서브클래스

  • FileWriter: 파일에 문자 데이터를 쓰기 위한 클래스입니다.
  • BufferedWriter: 출력 스트림을 버퍼링하여 효율적으로 데이터를 쓰기 위한 클래스입니다.

 

- 예제

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String[] args) {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter("output.txt"));
            bw.write("Hello, World!"); // 파일에 문자열 쓰기
            bw.newLine(); // 줄 바꿈
            bw.write("Java I/O Example");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bw != null) {
                    bw.close(); // 스트림 닫기
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

마무리

Java의 I/O는 다양한 데이터 전송 작업을 수행하는 데 필수적인 기능입니다. 

InputStream, OutputStream, Reader, Writer 클래스는 각각 바이트 및 문자 단위의 데이터를 읽고 쓰는 데 사용됩니다. 

클래스를 적절히 활용하면 파일, 네트워크 등 다양한 소스와의 데이터 통신을 효율적으로 처리할 수 있습니다.

반응형