티스토리 뷰

Java

13. I/O

kingsubin 2021. 2. 24. 20:17

목표

자바의 Input과 Ontput에 대해 학습하세요.

학습할 것 (필수)

  • 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
  • InputStream 과 OutputStream
  • Byte 와 Character 스트림
  • 표준 스트림 (System.in, System.out, System.err)
  • 파일 읽고 쓰기

 

I/O 

Input / Output 의 준말로, 프로그램 외부로 부터의 입력과 출력을 의미한다.

Java 에서는 java.io 패키지에 있다.

 

New I/O 

Java 1.4 부터 추가된 API 로 Non-blocking 처리가 가능하며, Stream 이 아닌 Channel 을 사용한다.

java.nio 패키지에 있다.

 

I/O vs New I/O 

https://bingbingpa.github.io/java/whiteship-live-study-week13/

 


Stream 

단방향으로 자료의 입출력을 도와주는 중간 매개체

연속된 데이터의 흐름으로 입출력 진행시 다른 작업을 할 수 없는 블로킹 상태가 된다.

FIFO (First In First Out) 형식

 

Buffer 

데이터를 전송하는 상호 간의 장치에서 고속장치와 저속장치 간의 속도 차이로 인해 저속의 장치가 작업을 처리하는 동안, 고속의 장치가 기다려야 하는 현상을 줄여주는 기술이며 데이터를 임시 저장하는 공간을 의미한다.

이렇게 버퍼를 사용하면, API 호출 횟수를 줄여서 입출력 성능을 개선할 수 있다.

실제로 Scanner 를 사용할때와 BufferedReader 사용할때 성능에 차이가 있다.

 

Channel 

입력과 출력을 동시에 할 수 있다.

데이터가 통과하는 쌍방향 통로이며, 채널에서 주고 받을때 사용 되는 것이 Buffer 이다.

 


InputStream / OutputStream

- InputStream

바이트 기반 입력 스트림의 최상위 추상 클래스.

버퍼, 파일, 네트워크 단에서 입력되는 데이터를 읽어오는 기능을 수행한다.

  • int available() : 현재 읽을 수 있는 바이트 수를 반환
  • void close() : 현재 열려있는 InputStream을 닫는다
  • void mark(int readlimit) : InputStream에서 현재의 위치를 표시
  • boolean markSupported() : 해당 InputStream에서 mark()로 지정된 지점이 있는지에 대한 여부를 확인
  • abstract int read() : InputStream에서 한 바이트를 읽어서 int 값으로 반환
  • int read(byte[] b) : 인자 만큼의 데이터를 읽어서 b에 저장하고 읽은 바이트 수 반환
  • int read(byte b, int off, int len) : len만큼 읽어서 b의 off위치에 저장하고 읽은 바이트 수 반환
  • void reset() : mark()를 마지막으로 호출한 위치로 이동
  • long skip(long n) : InputStream에서 n바이트 만큼 데이터를 스킵하고 바이트 수를 반환

 

 

- OutputStream

바이트 기반 출력 스트림의 최상위 추상 클래스.

버퍼, 파일, 네트워크 단으로 데이터를 내보내는 기능을 수행한다.

  • void close() : OutputStream을 닫는다.
  • void flush() : 버퍼에 남아있는 출력 스트림을 출력
  • void write(byte[] b) : 버퍼의 내용을 출력
  • void write(byte[] b, int off, int len) : b 배열 안에 있는 시작 off부터 len만큼 출력
  • abstract void write(int b) : 정수 b의 하위 1바이트를 출력

 

https://bingbingpa.github.io/java/whiteship-live-study-week13/

 

 

ByteStream / CharacterStream

- ByteStream 

데이터를 Byte 단위로 주고 받는 것을 의미

binary 데이터를 입출력하는 스트림

데이터는 1바이트 단위로 처리 

이미지, 동영상 등 모든 종류의 데이터들을 송수신 할 때 사용

대표적인 ByteStream 에는 데이터 입력의 InputStream 과 데이터 출력의 OutputStream 이 있고 이 두 추상 클래스는 byte 기반 stream 의 최고 조상이다.

 

- CharacterStream

문자 단위로 인코딩 처리를 하는 스트림

데이터는 2바이트 단위로 처리

일반적인 텍스트 파일 및 JSON, HTML 등을 송수신 할 때 주로 사용

 

https://bingbingpa.github.io/java/whiteship-live-study-week13/

 


표준 스트림 ( System.in, System.out, System.err )

 

표준 스트림이란 프로그램 환경 사이에 연결된 입출력 스트림을 의미한다.

 

표준 입출력 스트림의 종류는 java.lang 패키지의 System 클래스 내부에 static 으로 선언되어 있다.

public final class System {
    public static final InputStream in;
    public static final PrintStream out;
    public static final PrintStream err;
    ....
}                  

 

- System.out

콘솔 화면에 문자열을 출력하기 위한 용도로 사용되는 출력 스트림이다.

 

- System.in

키보드의 입력을 받아들기 위해서 사용되는 입력 스트림이다.

 

- System.err 

  System.out 과 같은 출력 스트림이다.

  다른점으로는 err 는 버퍼링을 지원하지 않는다. 이것은 err 가 보다 정확하고 빠르게 출력되어야 하기 때문이라고 한다.

  버퍼링을 하던 도중 프로그램이 멈추면 버퍼링된 내용은 출력되지 않기 때문이다.

 


파일 읽고 쓰기

자바에서 파일을 읽고 쓰는 방법은 내장 클래스인 FileWriter, BufferdWriter, FileReader, BufferdReader 을 사용한다.

텍스트 파일인 경우 문자 스트림 클래스들을 사용하면 되고, 바이너리 파일인 경우 바이트 스트림을 기본적으로 사용한다.

입출력 효율을 위해 Buffered 계열의 보조 스트림을 함께 사용하는것이 좋다.

 

- 텍스트 파일

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

 

- 이진 파일

BufferedInputStream is = new BufferedInputStream(new FileInputStream("a.jpg"));
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("b.jpg"));
byte[] buffer = new byte[16384];
while (is.read(buffer) != -1) {
    os.write(buffer);
}

 


※ 스터디

github.com/whiteship/live-study/issues/13

 

※ 출처

velog.io/@jaden_94/13주차-항해일지-IO

bingbingpa.github.io/java/whiteship-live-study-week13/

github.com/kyu9/WS_study/blob/master/week13.md

'Java' 카테고리의 다른 글

@InitBinder  (0) 2021.02.26
java validation  (0) 2021.02.26
12. 애노테이션  (0) 2021.02.06
11. Enum  (0) 2021.01.29
10. 멀티쓰레드 프로그래밍  (0) 2021.01.27