블로그

[JAVA] 입출력 스트림 (I/O stream) 본문

개발자 준비과정/JAVA

[JAVA] 입출력 스트림 (I/O stream)

하늘바람a 2024. 3. 27. 17:51
입출력의 정의

 
I/O : Input과 Output의 약자
입출력 : 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것
 

io 스트림(입출력 스트림)

스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.

자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룬다.

  • 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
  • 그래서 입출력을 동시에 수행하려면 입력스트림, 출력 스트림 모두 2개의 스트림이 필요하다.
  • 일반적으로 FIFO(First-In-First-Out) 구조를 따른다.
스트림의 input, output 그림
입출력 스트림의 종류
  1. 바이트 스트림(Byte Stream): 바이트 스트림은 바이너리 데이터, 즉 그림, 멀티미디어 등 모든 종류의 데이터를 입출력할 때 사용됩니다. 이 스트림은 데이터를 8비트 바이트로 읽고 쓰는 데 사용됩니다. InputStream과 OutputStream 클래스 및 이들의 하위 클래스들이 이러한 바이트 스트림을 제공합니다.
  2. 문자 스트림(Character Stream): 문자 스트림은 문자를 입출력할 때 사용됩니다. 이 스트림은 데이터를 유니코드 문자 단위로 읽고 쓰는 데 사용됩니다. 주로 텍스트 파일과 같은 문자 데이터를 다룰 때 사용됩니다. Reader와 Writer 클래스 및 이들의 하위 클래스들이 이러한 문자 스트림을 제공합니다.

Chat GPT 답변



바이트 스트림(InputStream, OutputStream)

 
InputStream : 프로그램 외부 입력을 바이트 단위로 받기 위한 객체의 클래스 . 추상메서드
OutputStream : 프로그램 외부 출력을 바이트 단위로 받기 위한 객체의 클래스. 추상메서드

read() 메소드는 해당 입력 스트림에서 더 이상 읽어들일 바이트가 없으면, -1을 반환해야 합니다. 그런데 반환 타입을 byte 타입으로 하면, 0부터 255까지의 바이트 정보는 표현할 수 있지만 -1은 표현할 수 없게 됩니다. 따라서 InputStream의 read() 메소드는 반환 타입을 int형으로 선언하고 있습니다.

출력 스트림의 write(int b) 메소드 설명

public abstract void write(int b)
                    throws IOException
Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

이 메소드는 지정된 바이트를 출력 스트림에 쓰는 역할을 합니다. write 메소드의 일반적인 규약은 하나의 바이트가 출력 스트림에 쓰여진다는 것입니다. 쓰여질 바이트는 전달된 매개변수 b의 8개의 하위 비트입니다. b의 24개의 상위 비트는 무시됩니다. 이 메소드는 IOException을 던질 수 있습니다.


입출력스트림과 그 대상

InputStream, OutputStream을 사용해서 그림 파일을 복사하는 예제

import java.io.*;
public class C06CopyFile {
    public static void main(String[] args) {
        // temp/dog.png 파일을
        // temp/dog-copy.png 파일로 복사
        String src = "temp/dog.png";
        String des = "temp/dog-copy.png";

        try {
            InputStream is = new FileInputStream(src);
            OutputStream os = new FileOutputStream(des);
            try (is; os) {
                byte[] data = new byte[1024];
                int len = 0;
                while ((len = is.read(data)) != -1) {
                    os.write(data, 0, len);
                }
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


문자 스트림(Character Stream)


Reader
: 문자기반 스트림
Writer : 문자기반 스트림

자바에서는 한 문자를 의미하는 char형이 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데 어려움이 있다.
문자데이터를 입출력 할 때는 문자기반 스트림을 사용하는게 좋다.


바이트기반 스트림에서 문자기반 스트림으로 변경

  • InputStream -> Reader
  • OutputStream -> Writer
  • ByteArrayInputStream -> CharArrayReader

Class Reader의 메서드

Class Writer의 메서드


출처 : 자바의 정석(남궁성 저), 이것이 자바다(신용권 저), TCP School 사이트

'개발자 준비과정 > JAVA' 카테고리의 다른 글

깃 사용법  (0) 2024.04.01
[JAVA] 네트워크  (0) 2024.03.29
[JAVA] 예외 처리  (1) 2024.03.25
[JAVA] 스트림 - IntStream, reduce(), Optional<T>  (0) 2024.03.22
[JAVA] 스트림 기초  (0) 2024.03.21