자바의 Input과 Ontput에 대해 학습하세요.
java.io
와 java.nio
각 기반의 I/O를 살펴보기에 앞서 자바에서의 I/O는
java.io
,java.nio
의 두 패키지로 나눠진다. 나는 이 둘을 큰 틀로 잡고 비교하여 정리하였다.
java.io
와 java.nio
의 차이점io, nio는 입출력, 버퍼, 비동기, 블로킹/넌블로킹의 방식이 서로 다르다.
구분 | IO | NIO |
---|---|---|
입출력 방식 | 스트림 방식 | 채널 방식 |
버퍼 방식 | 넌버퍼(non-buffer) | 버퍼(buffer) |
비동기 방식 | 지원 안 함 | 지원 |
블로킹 / 넌블로킹 방식 | 블로킹 방식만 지원 | 블로킹 / 넌블로킹 방식 모두 지원 |
위 표를 보고 각 방식의 차이점에 대해 알아보자
IO는
NIO는
버퍼란
버퍼를 쓰면 빨라지는 이유
자바에서 I/O를 처리하는 영역은 유저영역 / 커널영역으로 구분할 수있다.
InputStream | OutputStream |
---|---|
abstract int read( ) | abstract void write(int b) |
int read(byte[ ] b) | void write(byte[ ] b) |
int read(byte[ ] b, int off, int len) | void write(byte[ ] b, int off, int len) |
출처 코딩팩토리 : https://coding-factory.tistory.com/281
InputStream은 바이트 기반 입력 스트림의 최상위 추상클래스이다. 읽기에 대한 다양한 추상 메서드가 있으며 목적에 따라 데이터를 입력 받을 수 있다.
출처 코딩 팩토리 : https://coding-factory.tistory.com/281
OutputStream은 바이트 기반 출력 스트림의 최상위 추상클래스이다.
스트림은 바이트 단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있다.
바이트기반은 입출력의 단위가 1byte라는 것이다.
입력 스트림 | 출력 스트림 | 입출력 대상의 종류 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리(byte배열) |
PipedInputStream | PipedOutputStream | 프로세스(프로세스간의 통신) |
AudioInputStream | AudioOutputStream | 오디오장치 |
위와 같이 여러 종류의 입출력 스트림이 있으며 필요에 따라 원하는 스트림을 사용하면 된다.
앞서 바이트 기반 스트림은 1byte를 입출력의 단위로 사용한다고 하였다. 하지만 자바에서 한 문자는 2byte를 차지하기 때문에 바이트 기반 스트림으로 문자를 처리하는데에는 어려움이 있다. 이 점을 보완하기 위해 문자기반의 스트림이 제공된다.
- InputStream -> Reader
- OutputStream -> Writer
자바에서는 표준 입출력을 위해 3가지의 입출력 스트림을 제공한다. 이 스트림들은 자바 애플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 개발자가 별도로 스트림을 생성하는 코드를 작성하지 않고도 사용이 가능하다.
아래 3가지는 모두 System 클래스에 속해 있는 클래스(static) 변수이다. 선언부분에는 InputStream, PrintStream이라고 적혀있지만 실제로는 BufferedInputStream, BufferedOutputStream의 인스턴스를 사용한다.
public final class System {
public static final InputStream in;
public static final PrintStream out;
public static final PrintStream err;
...
}
System.in
- 콘솔로부터 데이터를 입력받는데 사용System.out
- 콘솔로 데이터를 출력하는데 사용System.err
- 콘솔로 데이터를 출력하는데 사용자바에서는 io패키지의 File 클래스를 통해서 파일과 디렉토리를 다룰 수 있도록 하고 있다. 더불어 nio 패키지에서는 좀 더 다양한 파일의 속성 정보를 제공해주는 클래스와 인터페이스를
java.nio.file
,java.nio.attribute
패키지에서 제공한다.
File 클래스는 파일크기, 속성, 이름 등의 정보를 얻어내는 기능, 파일 생성, 삭제의 기능을 제공한다.
그러나 파일의 데이터를 읽고 쓰는 기능은 지원하지 않는다.
파일의 입출력은 Stream을 사용한다.