[Java] 입출력 스트림

박상혁·2023년 3월 12일
0

Java

목록 보기
6/10

서론

목차

  1. Stream이란
  2. Console에서의 입출력 방식(운영체제 입출력)
  3. System.in, System.out, Scanner
  4. Byte, Character 기반 스트림 - UTF-8 or 16
  5. 기타 보조 Stream
  6. File 입출력
  7. Network 입출력

본론

1. Stream이란?

수돗물
가래떡

한줄기로 쭈욱 끝없이 이어진 data 줄기

가래떡 뽑는 기계는
얼만큼 크게 뽑을지의 규격,
어떤 재료를 사용할것인지 등을 고려하여
기계 설정을 다르게 합니다.

마찬가지로 Java에서도 Stream의 종류에 따라 Stream(입출력 대상)의 여러 통로들을 만들어놓았습니다.

2. Console에서의 입출력 방식(운영체제 입출력)

3. System.in, System.out, Scanner

4. 보조 Stream 구현 방식


Stream의 기능을 보완 및 추가하기 위해 디자인 패턴의 데코레이터 패턴으로 생성자에 Stream을 추가하여 보조 Stream 클래스들을 구현해놓았습니다.
위 그림과 같이 감싼다는 형식으로 이해하면 좋습니다.

Stream의 특징

다음과 같은 특징을 가지고 있습니다.

  • 데이터 운반에 사용
  • 단방향
  • Byte or Char
  • FIFO

OS의 힘을 빌리기

  • 키보드의 입력들을 받아오기
  • 화면 출력
  • 네트워크를 통해 데이터 송/수신
  • 2차 메모리에서 파일 입출력

이 모든것은 Java Application 혼자서 해결할 수 없고, 운영체제의 API를 이용해야 합니다.

Java Stream 종류

데이터가 들어오고 나가는 통로의 역할에 대해 규정해 놓은 추상클래스들에 따라서
입출력 대상에 따라 통로를 각각 구현한 인스턴스들로 이루어져 있습니다.

java.io 패키지를 통해 제공되고 있습니다.

Byte기반 Stream

InputStream, OutputStream의 추상클래스를 각각 대상에 따라 구현한 객체들이 있습니다.

  • FileOutputStream: File 입출력
  • ByteArrayOutputStream: Byte배열 Memory 입출력
  • PipedOutputStream: Process간 통신
  • AudioInputStream: 오디오 장치 입출력
    ...

다음은 메서드입니다.

  • abstract int read()
  • abstract void write(int b)

이렇게 주로 읽기와 쓰기 메서드를 가지고 있습니다.
(read 타입이 byte가 아닌 int인 이유는 byte범위인 0~255와 -1이기 때문입니다.)

문자(Char)기반 Stream

오로지 스트림의 기능을 보완하기 위한 용도로 쓰입니다.
보조 스트림 자체에는 입출력 기능이 존재하지 않습니다.

FilterInputStream라는 추상클래스를 구현한 구현체들입니다.

  • BufferdInputStream
  • DataInputStream
  • PushbackInputStream
  • LineNumberInputStream

보조 Stream 중에서도 잘 쓰이는 Buffer 입출력 계열

hello.txt를 읽으려 할 때,
FileInputStream을 이용하여

FileInputStream f = new FileInputStream("hello.txt");

로 할 수 있으나 성능을 조금 더 향상시키고자

BufferedInputStream b = new BufferedInputStream(f);
b.read();

Buffer를 이용하여 입출력을 할 수 있게 되었습니다.

운영체제 API를 한번씩 호출하는 것 보다 Buffer를 사용함으로써 한번에 호출해서 가져오는 방식을 사용합니다.
이로써 운영체제 자원을 덜 사용함으로써 실행속도 면에서 이득을 가져올 수 있습니다.

이는 기반 스트림인 FileInputStream을 이용하여 보조스트림을 만듬으로써
실질적으로 입출력은 FileInputStream이 수행하고 BufferedInputStream은 Buffer만을 제공합니다.

Java 표준입출력

자바의 시스템 기본 표준으로 정의한 입출력 클래스입니다.

이들은 전부 Character단위가 아닌 Byte단위의 Stream입니다.
System.in
System.out
System.err

System Class는 운영체제의 일부 기능(I/O나 프로그램 종료(exit, kill..), 시간 읽기 등)을 사용할 수 있게 해줍니다.

class System {
	final static InputStream in;
    final static PrintStream out;
    final static PrintStream err;
    ...
    static long currentTimeMillis()
    public static Console console()
    static void exit(int status)
    ...
}

이중에서 in, out, err를 이용하여 입출력을 할 수 있습니다.

요약 및 결론

참조

Exploring JAVA - 8. Input/Output Facilities
위키백과 - 표준 스트림
키보드로 입력한 값이 콘솔로 출력될 때까지
자바 [JAVA] - 스캐너(Scanner) 클래스와 입력
[JAVA] File I/O(Input/Output)기초(파일 입출력 스트림에 대한 이해)
Jinnie Park - [JAVA스터디]자바 입출력(1)-System,Stream,표준입출력,객체입출력

profile
개발 노트

0개의 댓글