안녕하세요! 자바(JAVA)를 처음 배우다 보면 프로그램이 어떻게 데이터를 주고받는지 궁금해지기 마련입니다. 따라서 이번 글에서는 자바의 입출력 스트림, 보조 스트림, 그리고 입출력 API에 대해 정리해보았습니다.
요약하자면, 입출력 스트림은 자바에서 데이터 전송을 처리하는 기본적인 방식으로, 파일이나 네트워크와의 데이터 교환에서 중요한 역할을 합니다.
또한, 보조 스트림은 주 스트림과 결합해 데이터 처리의 효율성을 높이고 다양한 기능을 추가해 주는 역할을 하죠.
자바의 입출력 API는 이러한 스트림들을 손쉽게 사용할 수 있도록 해주는 도구 모음입니다.
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은 기본 타입 데이터를 읽고 쓸 수 있는 보조 스트림이다.
- 이를 통해 int, double, boolean 등의 기본 타입을 파일에 쉽게 저장하고 읽을 수 있다.
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 클래스를 사용하여 특정 파일이 존재하는지 확인하고 있다.
혹시 이해가 어려우시다면, 이전 글을 먼저 참고해보시면 좋을 것 같습니다.
반응형
'IT & AI > AI 지식' 카테고리의 다른 글
SQL 기본 SELECT 명령어를 비롯한 다양한 함수 활용 (1) | 2024.11.27 |
---|---|
SQL 기본 및 명령어 DCL, DDL, DML, TCL (0) | 2024.11.26 |
JAVA 기본 API, 스레드, 컬렉션 프레임워크 (0) | 2024.11.22 |
JAVA 인터페이스, 중첩 클래스, 예외 처리 방법 (0) | 2024.11.22 |
JAVA 객체 지향 프로그래밍: 클래스, 상속 (0) | 2024.11.21 |