스트림 입출력이란?
스트림 입출력은 데이터를 순차적으로 읽거나 쓰는 작업을 버퍼를 사용하여 처리하는 방식입니다. 이는 파일, 네트워크, 사용자 입력 등 다양한 입출력 장치와 프로그램 간의 데이터 전달을 효율적으로 관리할 수 있게 해줍니다.
자바의 입출력 스트림
자바에서는 입출력 스트림을 이용해 응용 프로그램과 외부 입출력 장치 간의 데이터를 연결합니다. 스트림은 크게 입력 스트림과 출력 스트림으로 나뉩니다.
- 입력 스트림(Input Stream): 입력 장치(예: 키보드, 파일)로부터 자바 프로그램으로 데이터를 전달하는 역할을 합니다.
- 출력 스트림(Output Stream): 자바 프로그램에서 처리된 데이터를 출력 장치(예: 모니터, 파일)로 출력하는 역할을 합니다.
자바의 입출력 스트림 종류
자바에서 입출력 스트림은 바이트 스트림과 문자 스트림으로 나눌 수 있습니다. 바이트 스트림은 1바이트씩 데이터를 처리하는 반면, 문자 스트림은 2바이트씩 문자 단위로 데이터를 처리합니다.
- 바이트 스트림: 기본적인 입출력 클래스로, 데이터를 바이트 단위로 처리합니다.
- 주요 클래스: FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream
- 문자 스트림: 텍스트 파일을 읽거나 쓸 때 사용되는 클래스들로, 문자 단위로 처리합니다.
- 주요 클래스: FileReader, FileWriter, BufferedReader, BufferedWriter
JDK의 문자 스트림 클래스 계층 구조
자바의 문자 스트림 클래스는 Reader와 Writer 클래스를 상속하여 구현됩니다. 이들은 문자 데이터를 효율적으로 처리하는 데 유용합니다.
- 문자 입력 스트림: FileReader, InputStreamReader
- 문자 출력 스트림: FileWriter, OutputStreamWriter
FileReader를 이용한 텍스트 파일 읽기
FileReader 클래스는 텍스트 파일을 읽기 위한 가장 기본적인 클래스입니다. 사용법은 다음과 같습니다.
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("example.txt")) {
int i;
while ((i = fr.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
InputStreamReader와 OutputStreamWriter
InputStreamReader와 OutputStreamWriter는 각각 바이트 스트림과 문자 스트림 간의 변환을 담당하는 클래스입니다. 이들을 사용하면 바이트 스트림으로 읽거나 쓴 데이터를 문자 스트림으로 변환할 수 있습니다.
InputStreamReader 생성자
InputStreamReader isr = new InputStreamReader(System.in);
InputStreamReader는 InputStream을 문자 스트림으로 변환해줍니다. 위 예제에서는 표준 입력을 문자 스트림으로 처리합니다.
OutputStreamWriter 생성자
OutputStreamWriter osw = new OutputStreamWriter(System.out);
OutputStreamWriter는 바이트 출력을 문자 스트림으로 변환하여 표준 출력에 데이터를 쓸 수 있게 해줍니다.
바이트 스트림 클래스
자바의 바이트 스트림 클래스는 파일 입출력 작업에서 널리 사용됩니다. 이 스트림은 바이트 단위로 데이터를 읽거나 씁니다.
FileOutputStream 생성자 및 주요 메소드
FileOutputStream 클래스는 바이트 단위로 파일에 데이터를 출력하는 데 사용됩니다.
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write("Hello, Java!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- write(byte[] b): 바이트 배열을 파일에 씁니다.
- close(): 스트림을 닫고 리소스를 해제합니다.
버퍼 입출력 스트림
버퍼 입출력 스트림은 데이터를 일시적으로 메모리에 저장하고, 데이터를 한 번에 처리하여 성능을 향상시킵니다.
Buffered 스트림의 주요 생성자
BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream 클래스는 데이터를 버퍼에 임시 저장한 후 한 번에 읽거나 쓰는 방식으로 성능을 개선합니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
File 클래스
File 클래스는 파일 시스템과 상호작용하기 위한 다양한 메소드를 제공합니다. 파일 생성, 삭제, 정보 조회 등 여러 기능을 수행할 수 있습니다.
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
File file = new File("example.txt");
if (file.exists()) {
System.out.println("File exists!");
} else {
try {
file.createNewFile();
System.out.println("File created!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
결론
자바의 입출력 스트림을 이해하고 사용하는 것은 파일 처리 및 데이터 전송에서 매우 중요합니다. 바이트 스트림과 문자 스트림의 차이점, 버퍼 입출력의 효율성, 그리고 File 클래스의 활용 방법까지 다양한 기능을 활용하여 효율적인 입출력 작업을 수행할 수 있습니다.