반응형

목표

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

학습할 것

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

스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O

스트림

  • FIFO(First In First Out)
  • 단방향 이기 때문에 입력 스트림과 출력 스트림을 별도로 사용해야 한다.
  • 연속된 데이터의 흐름으로 입출력 진행시 다른 작업을 할 수 없는 블로킹(Blocking) 상태가 된다.
  • 입출력 대상을 변경하기 편하며 동일한 프로그램 구조를 유지할 수 있다.

스트림 종류

  • 바이트 스트림(Byte Stream)
    • 데이터를 Byte 단위로 주고 받는 것을 의미
    • binary 데이터를 입출력하는 스트림
    • 이미지, 동영상등 모든 종류의 데이터들을 송수신할 떄 주로 사용
    • 대표적인 바이트 스트림에는 데이터 입력의 InputStream과 데이터 출력의 OutputStream이 있고 이 두 추상 클래스는 byte기반 stream의 최고 조상이다
  • 문자 스트림 (Character Stream)
    • 문자 단위로 인코딩 처리를 하는 스트림
    • 텍스트 파일등을 송수신할 떄 주로 사용

버퍼 

  • byte, char, int 등 기본 데이터 타입을 저장할 수 있는 저장소로서, 배열과 마찬가지로 제한된 크기(capacity) 에 순서대로 데이터를 저장한다.
  • 버퍼는 데이터를 저장하기 위한 것이지만, 실제로 버퍼가 사용되는 것는 채널을 통해서 데이터를 주고 받을 때 쓰인다.
  • 채널을 통해서 소켓, 파일 등에 데이터를 전송할 때나 읽어올 때 버퍼를 사용하게 됨으로써 가비지량을 최소화 시킬 수 있게 되며, 이는 가바지 콜렉션 회수를 줄임으로써 서버의 전체 처리량을 증가시켜준다.

채널

  • 데이터가 통과하는 쌍방향 통로이며, 채널에서 데이터를 주고 받을 때 사용 되는 것이 버퍼이다.
  • 채널에는 소켓과 연결된 SocketChannel, 파일과 연결된 FileChannel, 파이프와 연결된 Pipe.SinkChannel 과 Pipe.SourceChannel 등이 존재하며, 서버소켓과 연결된 ServerSocketChannel 도 존재한다.

자바 NIO(New I/O)

  • 자바 1.4 버전부터 추가된 API 로 넌블로킹(Non-blocking) 처리가 가능하며, 스트림이 아닌 채널(Channel)을 사용한다.

IO, NIO 비교

  • IO 의 방식으로 각각의 스트림에서 read() 와 write() 가 호출이 되면 데이터가 입력 되고, 데이터가 출력되기전까지, 스레드는 블로킹(멈춤) 상태가 된다. 이렇게 되면 작업이 끝날때까지 기다려야 하며, 그 이전에는 해당 IO 스레드는 사용할 수 없게 되고, 인터럽트도 할 수 없다. 블로킹을 빠져나오려면 스트림을 닫는 방법 밖에 없다.
  • NIO 의 블로킹 상태에서는 Interrupt 를 이용하여 빠져나올 수 있다.
    구분 IO NIO
    입출력 방식 스트림 채널
    버퍼 방식 Non-Buffer Buffer
    비동기 방식 지원 X O
    Blocking/Non-Blocking 방식 Blocking Only Both
    사용 케이스 연결 클라이언트가 적고, IO 가 큰 경우(대용량) 연결 클라이언트가 많고, IO 처리가 작은 경우(저용량)

InputStream과 OutputStream

InputStream

  • 바이트 기반 입력 스트림 최상위 클래스로 추상 클래스이다.
  • 모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.
  • InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메소드들이 정의 되어 있다.
메소드 설명
int available() 현재 읽을 수 있는 바이트 수를 반환한다
void close() 현재 열려있는 InputStream을 닫는다
void mark(int readlimit) InputStream에서 현재의 위치를 표시해준다
boolean markSupported() 해당 InputStream에서 mark()로 지정된 지점이 있는지에 대한 여부를 확인한다
abstract int read() InputStream에서 한 바이트를 읽어서 int값으로 반환한다
int read(byte[] b) byte[] b 만큼의 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 반환한다
int read(byte[] b, int off, int len) len만큼 읽어서 byte[] b의 off위치에 저장하고 읽은 바이트 수를 반환한다
void reset() mark()를 마지막으로 호출한 위치로 이동
long skip(long n) InputStream에서 n바이트만큼 데이터를 스킵하고 바이트 수를 반환한다

OutputStream

  • 바이트 기반 출력 스트림 최상위 클래스로 추상 클래스이다.
  • 모든 바이트 기반 출력 스트림은 이 클래스를 상속받아서 만들어진다.
  • OnputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메소드들이 정의 되어 있다.
메소드 설명
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바이트를 출력한다

Byte 와 Character 스트림

Byte Stream

  • binary 데이터를 입출력하는 스트림
  • 데이터는 1바이트 단위로 처리
  • 이미지, 동영상 등을 송수신 할 때 주로 사용
  • 예) FileInputStream, FileOutputStream, ByteArrayInputStream, ByteArrayOutputStream

Character Stream

  • text 데이터를 입출력하는 스트림
  • 데이터는 2바이트 단위로 처리
  • 일반적인 텍스트 및 JSON, HTML 등을 송수신할 때 주로 사용
  • 예) FileReader, FileWriter, CharArrayReader, CharArrayWriter

보조 스트림

  • FilterInputStream 과 FilterOutputStream 을 상속받는 클래스들로 기본 스트림과 결합하여 특정 상황에서 보다 편리하게 사용할 수 있다.
  • BufferedInputStream/BufferedOutputStream: 버퍼를 사용해 입출력 효율과 편의를 위해 사용
  • BufferedReader/BufferedWriter: 라인단위의 입출력이 편리함
  • InputStreamReader/OutputStreamReader: 바이트 스트림을 문자 스트림처럼 쓸 수 있도록하며 문자 인코딩 변환을 지원
  • DataInputStream/DataOutputStream: 자바 원시자료형 데이터 처리에 적합

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

  • System.out 은 콘솔 화면에 문자열을 출력하기 위한 용도로 사용되는 출력 스트림이다.
  • System.in 은 키보드의 입력을 받아들이기 위해서 사용되는 입력 스트림이다.
  • System.err 는 버퍼링을 지원하지 않는다. 이것은 err 이 보다 정확하고 빠르게 출력되어야 하기 때문이라고 한다. 버퍼링을 하던 도중 프로그램이 멈추면 버퍼링된 내용은 출력되지 않기 때문이다.

파일 읽기

텍스트 파일 생성

testfile.txt 

 

보조 스트림을 이용하여 파일 읽기

 

 

파일 쓰기

보조 스트림을 이용하여 파일 쓰기

새로 생성된 testwrite 파일

 

텍스트 파일 내용

 

 

 

 

 

 

 

 

 

참조

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

 

자바 I/O

자바 I/O Feb 11, 2021  Java  whiteship/live-study  java  java I/O whiteship/live-study 13주차 정리 목표 학습할 것 (필수) 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream 과 OutputStream Byte 와 Character

bingbingpa.github.io

www.notion.so/I-O-af9b3036338c43a8bf9fa6a521cda242

 

I/O

목표

www.notion.so

 

728x90
반응형

+ Recent posts