자바 입출력 (I/O)
* 스트림 : 자바에서 데이터를 운반하는데 사용되는 연결통로라고 할 수 있다.(데이터를 저장하는 방식인 스트림과는 용어만 같을 뿐 다른 개념이다.)
* 스트림은 단방향으로만 이루어지기 때문에 하나의 스트림으로 동시에 입력과 출력 작업을 수행하는 것은 불가능하다. 동시에 처리하기 위해서는 입력 스트림과 출력 스트림이 각각 존재 한다.
스트림의 종류
입출력 대상에 따라 아래와 같은 스트림 종류가 존재한다.
종류 | 입력 스트림 | 출력 스트림 | ||
|
|
|
스트림 클래스들은 기본적으로 read()메서드와 write()메서드를 사용한다.
위의 스트림 클래스들의 경우 주요 스트림 기능을 수행하는 것이며, 이에 반해 그 자체로 주요한 기능을 수행하지는 못하지만, 주요 스트림의 성능을 보완하는 역할을 하는 보조 스트림이 존재한다. 보조 스트림에서 BufferedInputStream, DataInputStream 등이 존재한다. 보조 스트림이 아래에 구현된 것과 같이 주요 스트림을 기반으로 하여 생성된다.
FileInputStream fis = new FileInputStream("test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read();
Ex) ByteArrayInputStream, ByteArrayOutputStream
- ByteArrayInputStream
- ByteArrayOutputStream
Ex) FileInputStream
- FileInputStream
본래 스트림 사용 후 작업이 완료된 후에는 사용한 스트림을 닫아주어야 자원이 낭비되지 않는다. 스트림을 닫기 위해서는 명시적으로 close()메서드를 사용하거나, 위의 코드처럼 try-with-resources 문을 사용하면 해당 문을 빠져나가면 스트림이 닫히게 된다.
* try-with-resources문: try(resources) {} catch() {}
보조 스트림의 종류
- BufferedInputStream - BufferedOutputStream
- FilterInputStream - FilterOutputStream
- ObjectInputStream - ObjectOutputStream
- ZipInputStream
- DataInputStream - DataOutputStream
Ex) BufferedInputStream과 BufferedOutputStream을 활용하여 파일 복사
BufferedInputStream과 BufferedOutputStream은 입출력 스트림을 버퍼링하여 입출력 성능 향상에 도움을 주는 보조스트림이다.
* 스트림을 버퍼링하다?
데이터를 입출력 할 때에 일정한 크기의 메모리 버퍼를 사용하여 데이터를 임시 저장하여, 한 번에 작업을 수행할 수 있도록 하는 것, 입출력 시에 바이트마다 스트림이 작업을 수행하는 것보다, 입출력 데이터를 한 번에 받아 버퍼에 저장해 둔 후 스트림 작업을 수행하는 것이 I/O 오버헤드를 줄여주어 작업 성능 향상에 도움을 준다.
문자 스트림 종류
앞서 이야기 했던 스트림 종류들의 경우 모두 바이트 기반 스트림으로(1바이트씩 처리되는...), 기본적으로 문자가 2바이트 단위로 처리되는 자바에서 문자를 처리하기 위해 사용하기에는 어려움이 있기 때문에 문자 처리 시에는 별도로 아래와 같은 문자 기반 스트림을 사용한다.
- FileReader - FileWriter
- CharArrayReader - CharArrayWriter
- PipedReader - PipedWriter
- StringReader - StringWriter
문자 기반 보조 스트림의 종류
- BufferedReader - BufferedWriter
- FilterReader - FilterWriter
- LineNumberReader
Ex) FileReader와 FileWriter
byte 배열 대신 char 배열을 이용한다는 점을 제외하고는 ByteArrayInputStream과 ByteArrayOutputStream과 유사하다.
EX) PipedReader와 PipedWriter
쓰레드 간에 데이터를 주고받을 때 입출력 스트림을 연결하여 데이터를 주고 받을 수 있도록 해준다.
Ex) BufferedReader, BufferedWriter
입출력 스트림을 버퍼링하여 입출력 효율을 높이는데 도움을 주는 보조스트림이다. 문자 단위로 데이터를 입출력 할 수 있도록 해준다. 단 보조 스트림이기 때문에 기반이 되는 FileReader, FileWriter 스트림과 함께 사용해야 한다.
Ex) 자바 파일 출력하는 코드
Ex) txt 파일 복사하는 코드
'JAVA' 카테고리의 다른 글
[ Java ] - QueryDSL이란 무엇인가? (+기본 세팅) (0) | 2024.05.19 |
---|---|
[ JAVA ] - 람다식이란? (0) | 2023.10.19 |
[ Java ] - 난수 생성 (0) | 2023.10.18 |
[ Java ] - 프로세스와 쓰레드 - 02) (0) | 2023.10.17 |
[ Java ] - 프로세스와 쓰레드 - 01) (0) | 2023.10.16 |