💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 주관적인 생각을 정리한 글입니다.
☁️ 내용정리
I/O
I/O
는 Input/Output의 약어이다. 우리가 만든 프로그램의 어떠 내용을 파일에 쓰거나 저장할 일이 있을 때, 다른 서버나 디바이스로 보낼 일이 있을 때 사용한다. 여기서 서버는 DB서버, 웹 서버 등이 될 수 있다.
Input Output은 JVM기준이다. (JVM이 읽는 것은 Input, JVM이 쓰거나 외부로 전송하는 것은 Output)
자바 초기 단계에서는 IO를 처리하기 위해 java.io
패키지에 있는 클래스만을 제공했다.
java.io 패키지는 바이트
기반의 데이터를 처리하기 위해 여러 종류의 스트림(Stream)을 제공하는데 Stream은 단방향 통신으로 입력과 출력을 동시에 처리할 수는 없다.
따라서 읽는 작업은 InputStream
, 쓰는 작업은 OutputStream
을 통해서 작업하도록 되어 있다.
자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.
스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다.
바이트가 아닌 char
기반의 문자열로만 되어 있는 파일은 Reader
, Writer
라는 클래스로 처리한다.
자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송합니다.
하지만 자바에서 가장 작은 문자 타입인 char 형이 2바이트이므로, 1바이트씩 전송되는 바이트 기반 스트림으로는 원활한 처리가 힘든 경우가 있습니다.
따라서 자바에서는 바이트 기반 스트림뿐만 아니라 문자 기반의 스트림도 별도로 제공합니다.
이러한 문자 기반 스트림은 기존의 바이트 기반 스트림에서 InputStream을 Reader로, OutputStream을 Writer로 변경하면 사용할 수 있습니다.
java.io 패키지는 성능이 좋지 않다는 단점이 존재했다. 이러한 단점을 보완하고 JDK 1.4
부터 NIO
지원했다.
NIO은 스트림 기반이 아닌 Buffer
와 Channel
기반으로 데이터를 처리한다.
Java 7
부터는 NIO2
라는 것이 추가되었다. 파일을 보다 효율적으로 처리하기 위해 만들어졌다.
InputStream, OutputStream
Stream을 읽고 쓸 때는 InputStream 구현클래스의 read()와 OutputStream 구현클래스의 write() 메서드를 사용하면 된다. 유의해야할 점은 반드시 close() 메서드를 호출해야 한다는 것.
안전하게 사용하고 싶다면 try-with-resources 구문을 사용하여 자동으로 close되게 하는 것이 좋다.
try(BufferedReader bf = new BufferedReader(new InputStreamReader(System.in))) {
// bf 소비
}
Reader, Writer
Stream은 바이트를 다루기 위한 것이다. Reader는 char 기반의 문자열을 처리하기 위한 클래스이다. 즉, 우리가 일반적인 텍스트 에디로 쉽게 볼 수 있는 파일들을 처리하기 위한 클래스라고 보면 된다.
'JAVA > 자바의 신' 카테고리의 다른 글
28장. 다른 서버로 데이터를 보내려면 어떻게 해면 되나요? (0) | 2024.01.11 |
---|---|
27장. Serializable과 NIO도 살펴 봅시다. (1) | 2024.01.11 |
25장. 스레드는 개발자라면 알아두는 것이 좋아요 (1) | 2024.01.10 |
23, 24장. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Set, Queue, Map (2) | 2024.01.10 |
22장. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - List (1) | 2024.01.10 |