티스토리 뷰

스프링, 자바

자바의 I.O

killog 2021. 2. 20. 21:05
반응형

목표

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

학습할 것 (필수)

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

입출력이란?

입출력(I/O)이란 Input 과 Output의 약자로 입력과 출력을 말한다.
즉, 컴퓨터 내부 또는 외부 장치와 프로그램간의 데이터를 주고받는 것을 말한다.
예) 키보드로 데이터 입력받기, System.out.println() 을 이용해 화면에 출력하기

스트림, 버퍼, 채널 기반의 IO

스트림

  • FIFO
  • 단방향이라 입력 스트림과 출력 스트림을 별도로 해야한다.
  • 연속된 데이터 흐름으로 입출력 진행시, 다른 작업을 못하는 블로킹 상태가 된다.
  • 입출력 대상을 변경하기 편하다.

자바의 NIO(New IO)

  • 자바의 1.4버전부터 추가된 API 로 논블로킹 처리가 가능하며, 스트림이 아닌, 채널을 사용한다.

버퍼

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

IO vs NIO

  • IO 방식으로 각각의 스트림에서 read() 와 write() 가 호출이 되면, 데이터가 입력되고, 데이터가 입력되고, 데이터가 출력되기 전까지, 스레드는 블로킹상태가 된다. (= 작업이 끝날때까지 기다려야한다. = 해당 스레드가 사용 불가가된다. = 인터럽트도 안된다. = 닫기를 제외한 아무 방법이 없다.)
  • NIO 의 블로킹 상태에서는 Interrupt 를 이용해 빠져나올 수 있다.
구분 IO NIO
입출력 방식 스트림 채널
버퍼 방식 Non Buffer Buffer
비동기 방식 지원 x o
블로킹/논블롱킹 방식 블로킹만됨 둘 다
사용 케이스 연결 클라이언트가 적고
IO가 큰 경우(대용량)
연결 클라이언트가 많고
IO 처리가 작은 경우(저용량)

InputStream 과 OutputStream

InputStream

  • 바이트 기반 입력스트림의 최상위 추상 클래스
  • 모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.
  • 버퍼, 파일, 네트워크단에서 입력되는 데이터를 읽어오는 기능을 수행한다.
메소드 설명
read() 입력 스트림으로부터 1바이트를 읽어서 바이트를 리턴
read(byte[] b) 입력스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 리턴
read(byte[] b, int off, int len) 입력스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 배열 b[off] 개 부터 len개 까지 저장. 그리고 실제로 읽은 바이트 수만큼인 len개를 리턴, 만약 len개를 모두 읽지 못하면, 실제로 읽은 바이트 수를 리턴
close() 사용한 시스템 자원을 반납하고 입력 스트림 닫기
   

OutputStream

  • 바이트 기반 출력 시스템의 최상위 추상 클래스
  • 모든 바이트 기반 출력 스트림은 이 클래스를 상속받아서 만들어진다.
  • 버퍼, 파일, 네트워크단으로 데이터를 내보내는 기능을 수행한다.
메소드 설명
write(int b) 출력 스트림으로부터 1바이트를 보낸다.(b 의 끝 1바이트)
write(byte[] b) 출력 스트림으로부터 주어진 바이트 배열 b 의 모든 바이트를 보낸다.
write(byte[] b, int off, int len) 출력 스트림으로 주어진 바이트 배열 b[off] 부터 len 개 까지의 바이트를 보낸다.ㅂ
flush() 버퍼에 잔류하는 모든 바이트를 출력한다.
close() 사용한 시스템 자원을 반납하고 입력 스트림 닫기

byte 와 Character 스트림

Byte Stream

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

보조 스트림

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

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

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

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

파일의 읽고 쓰기

  • 텍스트 파일의 경우, 문자 스트림 클래스를 사용하면 되고, 바이너리 파일인 경우, 바이트 스트림을 기본적으로 사용한다.
  • 입출력 효율을 위해 Buffered 계열의 보조 스트림을 함께 사용하는게 좋다.

참고 문헌

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

반응형

'스프링, 자바' 카테고리의 다른 글

자바의 단점 , 보일러 플레이트  (0) 2021.02.25
java Reflection  (0) 2021.02.22
자바의 맵  (0) 2021.02.19
자바의 애노테이션  (0) 2021.02.06
자바의 제네릭  (2) 2021.02.03
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함