[day15] java-basic : I/O API

2 분 소요

I/O란

  • RAM에 들어있는 변수을 외부장치 입출력 장치에 보내거나 받는 것은 다 I/O와 관련이 있다. (I/O : Input/Output)

  • Java는 기본적으로 입출력 단위가 유니코드 기반으로 움직인다. (char가 2byte)

  • C, C++은 입출력 단위가 아스키코드 기반으로 움직인다. (char는 1byte)

  • 만약 클라이언트는 자바로, 서버는 C로 만든다면 문제가 발생한다.

  • 그래서 원래는 다 아스키코드 기반으로 만들었었다.

  • 90년대 이후부터는 유니코드 기반으로 만들어지기도 한다.

  • 그래서 자바가 다른 프로그램과 소통, 연결하기 위해서 아스키코드와 유니코드 기반 모두를 지원한다.

  • 자바는 기본적으로 character stream을 사용한다.

  • 다만 이기종과 접근하기 위해서 byte Stream도 제공하는 것이다.

  • 컴퓨터에서 Stream이란? 실시간 스트리밍 방송에서 스트림이란 단어를 왜 쓸까?

  • 실제로는 수십만개의 데이터가 넘어오지만 사용자가 느끼기에는 물흐르듯이 하나의 데이터를 받는 것처럼 느끼기 때문이다.

  • 실제로 “사랑합니다”라는 글자를 전송하면 자바에서는 스트림으로 ‘다’, ‘니’, ‘합’, ‘랑’, ‘사’라는 5개의 유니코드 단어가 따로따로 전송되는 것이다.

  • 이때 이 5개의 단어가 날라가는 통로가 바로 Stream이라고 하는 것이다.

  • 인터넷 속도가 안좋으면 버퍼링에 걸린다. 왜그럴까?

특징

  • FIFO방식이다.

  • 단방향이다.

  • 지연될 수 있다.

IO 처리 단위

  byte Char
입력 InputStream Reader
출력 OutputStream Writer

바이트 스트림

  • 입력출력이 Ram기반이 아니라 장치 기반이다.

  • 외부장치를 입력용으로 하면 InputStream, 외부장치를 출력용으로 하면 OutputStream이다.

  • FileInput/Output은 1byte단위이다.

  • 만약 20byte단위를 외부로 옮기려면 1byte씩 움직여서 20번 움직여야 한다.

  • 하지만 이렇게 되면 속도가 느리니까 Buffer라는 장치를 추가시킨 것이다. 그게 Filter클래스의 Buffered I/OStream이다.

  • byte하나가 뭘 의미하는지 헷갈릴 수 있다. 쪼갠 1byte가 무엇인지 애매할 때, 날라가는 정보는 정수야~ 실수하나 넘기는 거야~ 라고 알려주는 것처럼 보이는것이 Data I/OStream이다.

  • 근데 레퍼런스 타입을 주고 받을 때 쓰는 것이 Object I/OSteam 이다.

문자 스트림

  • 텍스트 형태의 정보를 주고 받을 때 2byte단위로 입출력한다.

  • InputStreamReader는 byte로 날라온 것을 2byte 형태로 바꾸는 Filter클래스들이다.

InputStream

  • int read() : 입력스트림으로 1byte씩 읽어와서 int형 값을 반환한다. 읽은 바이트가 파일의 끝이면 -1을 반환한다.

  • int close() : 연결된 것을 끊는 것이다.

OutputStream

  • void write(int c) : 스트림으로 출력

InputStreamReader/Writer

  • InputStream/OutputStream과 같지만 2byte단위로 읽어오기 때문에 char문자를 인식한다.

FileInputSteam

  • int read() : 입력스트림으로 1byte씩 읽어와서 int형 값을 반환한다. 읽은 바이트가 파일의 끝이면 -1을 반환한다.

  • 메소드는 그냥 InputStream 같지만 입출력 장치에 따라 construct만 다르기 때문에 이것만 잘 숙지하면 된다.

  • 디렉토리나 파일에 대한 정보를 클래스로 가지고 있는 아이가 File클래스이다.

FileOutputStream

  • File을 모니터 Console창처럼 쓰고싶은 것이다.

  • void write(int c) : 스트림으로 출력메소드

  • 메소드는 그냥 InputStream 같지만 입출력 장치에 따라 construct만 다르기 때문에 이것만 잘 숙지하면 된다.

  • FileNotException

  • 하드디스크에 파일이 있어도 지워서 무조건 0바이트로 만든다. 그래서 매개변수에 append를 true로 바꾸면 맨 마지막 내용에 이어 붙인다.

DataOutputStream

  • 기본 데이터형으로 입출력하고 싶을 때, 1byte씩 입출력된 파일 내용을 기본 자료형에 맞게 변형해주는 필터기능을 가지고 있는 것이다.

  • 화면에 보여줄 목적이 아니기 때문에 DataStream을 통해 입/출력된 내용은 저장에 의의가 있다.

  • 메모장 등으로 보면 기본 자료형에 맞게 데이터가 보이진 않지만, 기본 자료형 byte에 맞게 잘 저장이 되어 있는 것이다.

DataInputStream

  • 저장되어 있는 순서를 모르면 메소드를 결정할 수 없다는 단점이 있다.