2 minute read

📖 입출력 (I/O)

I/Oinput/output의 약자로 입출력이다.


🍄 스트림 (Stream)

  • 자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 흐름을 통해 다룬다.
  • 자료의 입출력을 도와주는 중간 매개자 역할이며, 응용 프로그램과 입출력 장치를 연결하는 소프트웨어 모듈
  • 데이터가 순서대로 들어오는 단방향의 통로이다.
  • 동기적이며 blocking방식이므로 데이터를 읽거나 쓰기 위해 스트림에 요청하면 스트림은 자신의 역할에 맞춰 다시 데이터를 읽거나 쓸 수 있을 때까지 다른 작업을 못하고 무한정 기다린다.

blocking이란?

  • 특정 작업이 실행 요청을 받아 실제로 수행되는 동안, 다른 작업은 작업을 진행하지 못하고 대기해야만 하는 방식


🍄 버퍼 (Buffer)

데이터를 전송하는 과정에서 두 장치가 서로 속도차이가 날 때, 고속 장치에서 발생하는 기다리는 시간을 줄여주는 역할을 한다.
또한 바이트 단위로 데이터가 입력된다면 Stream은 즉시 전송하는데, 이는 매번 출력이나 입력 때마다 운영체제를 불러오기 때문에 매우 비효율적인 처리가 된다.
따라서 버퍼를 사용하여 두 장치의 속도 차이를 개선하고, I/O의 성능을 향상시킨다.


🍄 BufferReader

  • 모든 값을 Stirng으로만 받는다.
  • throws IOException 예외처리를 꼭 해줘야 하며, try & catch로 처리도 가능하다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();


🍄 StringTokenizer

  • 위의 BufferedReader를 공백 단위로 쉽게 사용하기 위하여 사용하는 것이 StringTokenizer이다.
  • st.nextToken()을 사용하여 String타입의 데이터를 공백 단위로 나눌 수 있다.
StringTokenizer st = new StringTokenizer(br.readLine());
st.nextToken();


🍄 Channel

  • 기존 자바의 입출력 방식은 Stream의 단방향을 개선한 방식으로 NIO이다.
  • 데이터가 흘러다니는 양방향의 통로이므로 input/output을 구분하지 않는다.
  • 기존의 Stream과 다르게 무조건 buffer단위로 데이터를 전송한다.

I/O 대신 무조건 NI/O 가 좋은 방식인가?

  • 입출력 처리가 오래 걸리는 작업의 경우 스레들르 재사용하여 non-blocking 방식으로 처리하는 NIO는 좋은 효율을 내지 못할 수 있다.
  • 대용량 처리시 NIO의 버퍼 크기 문제로 복잡해질 수 있다.


📖 InputStream & OutputStream

  • 바이트 단위로 데이터를 입력/출력 스트림의 최상위 추상 클래스
  • 모든 바이트 기반 스트림은 이 클래스를 상속받는다.
  • 키보드나 다른 서버에서 입력/출력을 받을때 기본적으로 사용하는 메서드이다.

image


📖 Byte와 Character 스트림

  • Byte Stream
    • binary 데이터를 입출력
    • 데이터를 1바이트 단위로 처리
    • 이미지, 동영상 처리때 사용
  • Character Stream
    • text 데이터 입출력
    • 데이터는 2바이트 단위로 처리
    • 텍스트 처리떄 사용


📖 표준 스트림

public final class System {
    public static final InputStream in;
    public static final PrintStream out;
    public static final PrintStream err;
    ....
}  
  • 실제 java.lang 패키지에 접속하면 위와 같이 in/out이 정의되어 있다.
  • System.in/System.out 을 사용하면 inputstream/printStream을 사용하는 것이다.


📖 파일 읽고 쓰기

    public static void main(String[] args) {

        // 1. 파일 객체 생성
        File file = new File("d:\\example\\writeFile.txt");

        // 2. 파일 존재여부 체크 및 생성
        if (!file.exists()) {
            file.createNewFile();
        }
        
        // 3. Buffer를 사용해서 File에 write할 수 있는 BufferedWriter 생성            FileWriter fw = new FileWriter(file);
        BufferedWriter writer = new BufferedWriter(fw);

        // 4. 파일에 쓰기
        writer.write("안녕하세요");

        // 5. BufferedWriter close
        writer.close();
    }

개인 공부 기록용 블로그입니다.
틀리거나 오류가 있을 경우 제보해주시면 감사하겠습니다.😁