728x90

Obj. 자바의 Input과 Output에 대해 학습.

Todo.

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

13-2. InputStream과 OutputStream

13-3. Byte와 Character 스트림

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

13-5. 파일 읽고 쓰기


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

- 스트림 :

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

- 버퍼 : 

  • byte, char, int 등 기본 데이터 타입을 저장할 수 있는 저장소로서, 배열과 마찬가지로 제한된 크기에 순서대로 데이터를 저장한다.
  • 버퍼는 데이터를 저장하기 위한 것이지만, 실제로 버퍼가 사용되는 것은 채널을 통해 데이터를 주고 받을 때 쓰인다.
  • 채널을 통해서 소켓, 파일 등에 데이터를 전송할 때나 읽어올 때 버퍼를 사용하여 시스템 콜의 횟수를 줄여 주기에 서버의 성능이 증가한다

- 채널 :

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

- NIO (New I/O)  : 자바 1.4 버전부터 추가된 API로 넌블로킹 처리가 가능하며, 스트림이 아닌 채널을 사용한다.

  • NIO는 비동기 방식을 지원하여, 연결 클라이언트가 많고, IO처리가 작은 경우 자주 사용된다.

 

13-2. InputStream과 OutputStream

- InputStream 

  • 바이트 기반 입력 스트립의 최상위 추상 클래스
  • 모든 바이트 기반 입력 스트림은 이 클래스를 상속 받아서 만들어 진다.
  • 버퍼, 파일, 네트워크 단에서 입력되는 데이터를 읽어오는 기능을 수행한다.

- OutputStream

  • 바이트 기반 출력 스트림의 최상위 추상 클래스
  • 모든 바이트 기반 출력 스트림은 이 클래스를 상속 받아서 만들어 진다.
  • 버퍼, 파일, 네트워크 단으로 데이터를 내보내는 기능을 한다.
  • 메서드 중 flush() 를 해야만 버퍼에 잔류하는 모든 바이트를 출력한다.

13-3. Byte와 Character 스트림

- Byte Stream

  • 바이너리 데이터를 입출력 하는 스트림
  • 데이터는 1바이트(8비트) 단위로 처리
  • 이미지, 동영상 등을 송수신 할 떄 주로 사용

- Character Stream

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

- 보조 스트림

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

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

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

 	public static final InputStream in;
    public static final PrintStream out;
    public static final PrintStream err;
   ...
  }

- out, err는 둘다 출력 스트림이며, err는 버퍼링을 지원하지 않는다. err가 보다 정확하고 빠르게 출력되어야 하기 때문.

13-5. 파일 읽고 쓰기

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

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

- 텍스트 파일인 경우

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String s;
while ((s = br.readLine()) != null) {
    bw.write(s + "\n");
}

- 이진 파일인 경우

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);
}

Reference

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

728x90

'Java > [Whiteship]자바스터디' 카테고리의 다른 글

12주차 과제 : 애노테이션  (0) 2021.03.01
11주차 과제 : Enum  (0) 2021.02.28
10주차 과제 : 멀티쓰레드 프로그래밍  (0) 2021.01.27
9주차 과제 : 예외  (0) 2021.01.21
8주차 과제 : 인터페이스  (0) 2021.01.19

+ Recent posts