[Java] +82-심화편-정리하기 : 입출력 스트림 편

2023. 1. 17. 15:45·Java/자바 문법 정리
  • 입출력 스트림

 

 

java.io 패키지에는 여러 종류의 스트림 클래스를 제공하고 있다. 스트림 클래스는 다음과 같이 크게 두 종류로 구분된다.

 

바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용

문자 기반 스트림: 문자 데이터를 읽고 출력할 때 사용

 

  바이트 기반 스트림 문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스
(예)
XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStrema)
XXXReader
(FileReader)
XXXWriter
(FileWriter)

 

  • flush() : 출력 버퍼에 잔류하는 모든 바이트, 문자를 출력한다. 출력 스트림은 출력할 바이트나 문자를 바로 보내는 것이 아니라 내부 버퍼에 우선 저장해놓기 때문에 flush() 메소드로 버퍼에 잔류하는 바이트나 문자를 내보내야 한다.
  • close() : 해당 스트림을 닫는다.

 

 

  • 보조 스트림

 

기본 스트림인 InputStream/OutputStream, Reader/Writer를 직접 사용해서 데이터를 입출력할 수 있지만, 보조 스트림을 연결하여 여러 가지 편리한 기능들을 수행할 수 있다. 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 기본 스트림에 연결해서 입출력을 수행한다.

 

① 데이터를 변환해서 입출력하거나 데이터의 출력 형식을 지정하고 싶을 경우

② 입출력 성능을 향상시키고 싶을 경우

 

이 경우에는 기본 스트림에 보조 스트림을 연결하여 사용하면 편리하게 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 사용할 수 있다.

 

 

프로그램은 입력 스트림으로부터 직접 데이터를 읽지 않고 보조 스트림에서 제공하는 기능을 이용해서 데이터를 읽는다. 반대로 출력 스트림으로 직접 데이터를 보내지 않고 보조 스트림에서 제공하는 기능을 이용해 데이터를 보낸다.

 

  • 보조 스트림 연결하기

 

보조 스트림을 연결하려면 보조 스트림을 생성할 때 자신이 연결될 스트림을 다음과 같이 생성자의 매개값으로 제공하면 된다.

 

보조스트림 변수 = new 보조스트림(연결스트림);

 

보조 스트림의 생성자 매개값은 InputStream/OutputStream, Reader/Writer 이외에 또 다른 보조 스트림이 될 수 있다. 보조 스트림을 연속적으로 연결할 수 있다는 뜻이다. 예를 들어 다음과 같이 문자 변환 보조 스트림인 InputStreamReader를 다시 성능 보조 스트림인 BufferedReader에 연결할 수 있다.

 

InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);

 

 

  • 문자 변환 보조 스트림

 

소스 스트림이 바이트 기반 스트림(InputStream, OuputStream, FileInputStream, FileOutputStream)이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것을 고려할 수 있다. 문자 입출력은 Reader와 Writer가 편리하기 때문이다.

 

OutputStreamWriter

OutputStreamWriter는 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환하는 보조 스트림이다.

 

Writer writer = new OutputStreamWriter(바이트 기반 출력 스트림);

 

InputStreamReader

InputStreamReader는 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환하는 보조 스트림이다.

 

Reader reader = new InputStreamReader(바이트 기반 입력 스트림);

 

 

  • 성능 향상 보조 스트림 (★)

 

프로그램의 실행 성능은 입출력이 가장 늦은 장치를 따라간다. 이는 완전히 해결될 수는 없지만 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다. 기본적으로 출력 스트림은 내부에 작은 버퍼를 가지고 있지만 이것으로는 불충분하기 때문이다.

 

 

BufferedOutputStream과 BufferedWriter

BufferedOutputStream은 바이트 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이고, BufferedWriter는 문자 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이다. BufferedOutputStream과 BufferedWriter는 프로그램에서 전송한 데이터를 내부 버퍼에 쌓아두었다가 버퍼에 꽉 차면, 버퍼의 모든 데이터를 한꺼번에 보낸다. 메모리 버퍼로 데이터를 고속 전송하기에 출력 성능이 향상되는 효과를 얻게 된다.

 

BufferedOutputStream과 BufferedWriter 보조 스트림은 다음과 같이 생성자의 매개값으로 준 출력 스트림과 연결되어 추가적인 내부 버퍼를 제공한다.

 

BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);

 

 

BufferedInputStream과 BufferedReader

BufferedInputStream은 바이트 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이고, BufferedReader는 문자 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이다. BufferedInputStream과 BufferedReader는 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장해둔다. 프로그램은 외부의 입력 소스로부터 직접 읽는 대신 버퍼로부터 읽음으로써 읽기 성능이 향상된다.

 

BufferedInputStream과 BufferedReader 보조 스트림은 다음과 같이 생성자의 매개값으로 준 입력 스트림과 연결되어 추가적인 내부 버퍼를 제공한다.

 

BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);

 

 

BufferedReader는 라인 단위로 문자열을 읽는 매우 편리한 readLine() 메소드를 제공한다. readLine()은 Enter 키('\r' + '\n') 이전의 모든 문자열을 읽고 리턴한다. 이 메소드를 사용하면 키보드에서 입력한 내용 및 파일 내용을 라인 단위로 읽을 수 있다.

 

라인 단위로 문자열을 얻고 싶다면 BufferedReader 보조 스트림을 생성하고 readLine()으로 반복해서 읽으면 된다. 더 이상 읽을 라인이 없다면 readLine()은 null을 리턴한다.

 

...
BufferedReader br = new BufferedReader(reader);

while(true) {
    String data = br.readLine(); // 라인 단위 문자열 읽고 리턴
    if(data == null) break; // 파일 끝에 도달했을 경우
    System.out.println(data);
}

br.close();

 

 

  • 프린터 보조 스트림

 

PrintStream ps = new PrintStream(바이트 기반 출력 스트림);
PrintWriter pw = new PrintWriter(문자 기반 출력 스트림);

 

>> PrintStream의 println() 메소드로 출력한 내용은 BufferedReader의 readLine()으로 읽으면 매우 편리하다. println() 메소드는 '\n'을 포함하고 출력하므로 readLine() 메소드가 개행 문자 앞까지 쉽게 읽을 수 있기 때문이다.

 

 

 

 


 
혼자 공부하는 자바
혼자 해도 충분하다! 1:1 과외하듯 배우는 자바 프로그래밍 자습서 (JAVA 8 &11 지원) 이 책은 독학으로 자바를 배우는 입문자가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. ‘무엇을’ ‘어떻게’ 학습해야 할지 조차 모르는 입문자의 막연한 마음을 살펴, 과외 선생님이 알려주듯 친절하게, 그러나 핵심적인 내용만 콕콕 집어준다. 책의 첫 페이지를 펼쳐서 마지막 페이지를 덮을 때까지, 혼자서도 충분히 자바를 배울 수 있다는 자신감과 확신이 계속될 것이다! 20명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서 20명의 베타리더와 함께 구성하여 입문자에게 맞는 난이도, 분량, 학습 요소 등을 적극 반영했다. 어려운 용어와 개념은 한번 더 풀어 쓰고, 복잡한 설명은 눈에 잘 들어오는 그림으로 풀어 냈다. ‘혼자 공부해본’ 여러 입문자의 초심과 눈높이가 책 곳곳에 반영된 것이 이 책의 가장 큰 장점이다.
저자
신용권
출판
한빛미디어
출판일
2019.06.10

 

 

'Java > 자바 문법 정리' 카테고리의 다른 글

[Java] +82-기본편-정리하기 : 상속 편  (0) 2023.01.16
[Java] +82-기본편-정리하기 : 클래스 편  (1) 2023.01.07
[Java] +82-기본편-정리하기 : 언어의 기초  (0) 2023.01.06
'Java/자바 문법 정리' 카테고리의 다른 글
  • [Java] +82-기본편-정리하기 : 상속 편
  • [Java] +82-기본편-정리하기 : 클래스 편
  • [Java] +82-기본편-정리하기 : 언어의 기초
냅도
냅도
  • 냅도
    do IT now!
    냅도
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • PS (33)
        • 알고리즘 (17)
        • 코딩테스트 (12)
        • NYPC 2016 (4)
      • Web (7)
        • ✨ wish-world (2)
        • JavaScript (3)
      • 📘 (13)
        • 📌 이것이 코딩테스트다 (13)
      • 🎮 (2)
        • Unity (16)
        • 게임 수학 (1)
        • 게임 알고리즘 (1)
      • C++ (9)
      • Java (21)
        • Baekjoon.java (16)
        • CodeUp.java (1)
        • 자바 문법 정리 (4)
      • 개발일지 (3)
      • Game-Review (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    unity
    Cpp
    게임추천
    RhythmGame
    DP
    유니티
    NYPC2016
    혼자공부하는자바
    isaxioserror
    MAP
    최단경로
    dfs
    UGUI
    errortype
    C++
    텍스트게임
    구현
    이코테
    JS
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
냅도
[Java] +82-심화편-정리하기 : 입출력 스트림 편
상단으로

티스토리툴바