ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [live-study] 13주차 :: I/O
    JAVA/라이브 스터디 | whiteship 2021. 2. 21. 14:11

    https://youtu.be/HLnMuEZpDwU

    참고도서 : Java의 정석(3rd Edition), 이것이 자바다

     

     

     

     

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

    입출력
    • 입출력이란 말 그대로 입력과 출력을 줄여서 말한 것으로 Input과 Output (I/O)을 말한다.
    • 키보드로부터 데이터를 입력받는다거나, 화면에 출력한다던가 하는 것이 입출력의 기본 예이다.
    IO / NIO
    • 자바 4부터 새로운 입출력(NIO : New Input/Output)이라는 뜻에서 java.nio 패키지가 포함되었다.
    • 그리고 자바 7부터는 자바 IO와 NIO 사이의 일관성 없는 클래스 설계를 바로 잡고, 비동기 채널 등의 네트워크 지원을 강화한 NIO.2 API가 추가되었다. NIO.2는 java.nio2 패키지로 제공되지 않고, 기존 java.nio 하위 패키지에 통합되었다.
    • IO와 NIO는 데이터를 입출력한다는 목적은 동일하지만 방식에 있어서 차이가 난다.

    스트림 (Stream)
    • 여기서의 스트림은 I/O Stream으로 (Java 8 Collection API stream과 다른 개념) , 어느 한쪽에서 다른 한 쪽으로 데이터를 전달 할 수 있게 해주는 일종의 연결 통로 이다.
    • 스트림은 단 방향통신만 가능하여, 하나의 스트림으로 입출력을 동시에 처리할 수 없다.
    • 그래서 입출력을 동시에 수행하려면, 입력을 위한 입력스트림(InputStream)과 출력을 위한 출력스트림(OutputStream), 2개의 스트림이 필요하다.
    • 또한, 연속적으로 데이터를 주고 받으며 큐(queue)처럼 FIFO(First In First Out) 구조로 되어 있다.
    채널 (Channel)
    • 위에서 말했듯이 IO는 스트림 기반이다. 반면 NIO는 채널(Channel)기반이다.
    • 채널은 스트림과 달리 양방향으로 입력과 출력이 가능하다.
    • 그래서 입력과 출력을 위한 별도로 만들 필요가 없다. 예를 들어 하나의 파일에서 데이터를 읽고 저장하는 작업을 모두 해야한다면, FileChannel하나만 생성하면 된다.
    버퍼 (Buffer)
    • 버퍼(Buffer)란 메모리 저장소이다.
    • 버퍼란 입출력 전송 속도 차이에 대한 성능을 보완하기 위해 사용된다.
    • IO에서는 출력 스트림이 1바이트를 쓴다면, 입력 스트림이 1바이트를 사용하게 된다, 이러면 느릴 수 밖에 없다.
    • 버퍼를 사용하면 복수 개의 바이트를 한 번에 입력 받고 출력하여 빠른 성능을 낼 수 있다.
    • 그래서 IO는 버퍼를 제공해주는 보조 스트림인 BufferedInputStream, BufferedOutputStream을 연결해서 사용하기도 한다.
    • NIO는 기본적으로 버퍼를 사용해서 입출력하기 때문에 IO보다는 입출력 성능이 좋다.

     

    2.InputStream과 OutputStream

    InputStream
    • 프로그램이 데이터를 입력 받을 때의 스트림을 입력 스트림(InputStream)이라고 한다.
    • 바이트 단위 입출력을 위한 최상위 추상 클래스이다.
    • 모든 바이트 기반 입력 스트림은 InputStream을 상속받아서 만들어진다.

    • InputStream클래스의 주요 메소드는 다음과 같다.

    OutputStream
    • 프로그램이 데이터를 보낼 때의 스트림을 출력 스트림(OutputStream)이라고 한다.
    • 바이트 단위 입출력을 위한 최상위 추상 클래스이다.
    • 모든 바이트 기반 출력 스트림은 OutputStream을 상속받아서 만들어진다.

    • OutputStream클래스의 주요 메소드는 다음과 같다.

     

    3. Byte와 Character 스트림

    Byte Stream
    • Byte Stream은 두 개의 추상 클래스, InputStream과 OutputStream으로 부터 정의된다.
    • FilterInputStream과 FilterOutputStream은 InputStream과 OutputStream의 자식이면서 모든 보조스트림의 조상이다.

    Character Stream
    • Character Stream은 말 그대로 문자데이터를 다루는데 사용된다.
    • 두 개의 추상 클래스 Redaer와 Writer로 부터 정의된다.
    • byte 대신 char 배열을 사용한다는 것 외에 Byte 스트림의 InputStream/OutputStream과 크게 차이가 나지 않는다.

     

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

    콘솔 입출력
    • 콘솔(Console)은 시스템을 사용하기 위해 키보드로 입력을 받고 화면으로 출력하는 소프트웨어이다.
    • 자바는 콘솔로부터 데이터를 입력받을 때 System.in을 사용하고, 콘솔에 데이터를 출력할 때 System.out을 사용하고, 에러를 출력할 때 System.err을 사용한다.

     

    System.in / .out / .err
    • System.in : 자바는 프로그램이 콘솔로부터 데이터를 입력 받을 수 있도록, System 클래스의 in 정적 필드를 제공하고 있다.
    • 앞서 System.in으로 콘솔에 입력된 데이터를 읽었다면, 콘솔로 데이터를 출력하기 위해서는 System클래스의 out 정적 필드를 사용한다.
    • 에러를 출력하기 위해서는 마찬가지로 System클래스의 err 정적 필드를 사용한다.

     

    5. 파일 읽고 쓰기

    File
    • 파일과 디렉토리를 다루는데 사용된다.
    • 참고자료를 확인하면, 다양한 방법으로 파일을 읽고 쓸 수 있겠지만, 지금은 BufferedReader/Writer만 다뤄본다.
    • BufferedReader

    • BufferedWriter - append
    • FileWriter에 append를 true로 주면 기존 파일의 끝에 텍스트를 추가할 수 있다.

     

    참고자료

     

    댓글

Programming Diary