Java

[Java] Java에서의 Stream (스트림)

Joo.v7 2024. 9. 12. 21:54

1. Stream

2. Java의 Stream

  • 바이트 기반 스트림
  • 문자 기반 스트림

3. Java의 보조 Stream(필터 Stream)

  • InputStreamReader
  • OutputStreamWriter
  • Buffer(버퍼)
  • BufferedInputStream과 BufferedReader
  • BufferedOutputStream과 BufferedWriter

* Stream 상속 관계 

 


1. Stream

  • 단방향으로 이동하는 데이터의 흐름.
  • 프로그램을 기준으로, 프로세스가 데이터의 도착지면 입력 스트림(InputStream) / 프로세스가 데이터의 출발지면 출력 스트림(OutputStream)
  • Stream은 사용이 끝난 후 .close()자원을 해제해야 한다, 보조(필터) 스트림이 닫히면 연결된 기본 스트림도 닫힌다.
    (try with resource 문을 사용해서 try문의 ()안에 stream을 입력하면 try문 종료 후 자동으로 close 한다)

출처: https://hudi.blog

 


2. Java의 Stream

 "java.io" 패키지에서 다양한 입출력 스트림 클래스를 제공한다. 크게, 바이트/문자 기반 스트림으로 나눈다.

 

1) 바이트 기반 스트림

 다양한 형태의 데이터를 주고 받을 수 있는 스트림.

  • InputStream
    • 바이트 기반 입력 스트림의 최상위 추상 클래스.
    • 하위 클래스는 __InputStream 의 이름을 가진다. ex) FileInputStream
    • .read() : InputStream 클래스의 주요 메소드로 InputStream으로부터 1byte를 읽고, return type은 int다. 따라서 int의 4byte 중 마지막 1byte에만 데이터가 저장된다. 더 이상 읽을 데이터가 없다면 -1을 return.
      ex) 00000000 00000000 00000000 10101010
    • .read(byte[] b) : 파라미터로 전달된 byte 배열에 InputStream으로부터 byte 단위로 읽어들인 데이터를 저장한다.

 

  • OutputStream
    • 바이트 기반 출력 스트림의 최상위 추상 클래스
    • 하위 클래스는 __OutputStream 의 이름을 가진다. ex) FileOutputStream
    • .write(byte[] b) : OutputStream 클래스의 주요 메소드로, write() 파라미터로 전달된 데이터를 OutputStream으로 1byte씩 출력한다. 
      ex) int b = 0x12345678, write(int b) 하면 write는 1byte만 전송하기 때문에 0x78만 전달해서 데이터 손실이 발생한다. 
    • .write(int b) : 파라미터로 전달된 데이터byte 단위로 OutputStream에 출력한다. int의 4byte 중 마지막 1byte만 전송.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyExample {
    public static void main(String[] args) {
        String sourceFile = "source.txt"; // 원본 파일 경로
        String destinationFile = "destination.txt"; // 복사할 파일 경로

        // try-with-resources: 자동으로 스트림을 닫아줌
        try (FileInputStream inputStream = new FileInputStream(sourceFile);
             FileOutputStream outputStream = new FileOutputStream(destinationFile)) {

            // 1바이트씩 읽고 쓰기
            int byteData;
            while ((byteData = inputStream.read()) != -1) {
                outputStream.write(byteData); // 읽은 바이트를 그대로 파일에 씀
            }

            System.out.println("파일 복사가 완료되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

2) 문자 기반 스트림

 오직 문자만 주고 받을 수 있는 스트림.

  • Reader
    • 문자 기반 입력 스트림의 최상위 추상 클래스.
    • 하위 클래스는 __Reader 의 이름을 가진다. ex) FileReader
    • .read() : Reader 클래스의 주요 메소드로 입력 대상으로부터 2byte씩 읽고, return type은 int다. 따라서 int의 마지막 2byte에만 데이터가 저장된다. 더 이상 읽을 데이터가 없다면 -1을 return.
      ex) 00000000 00000000 00010010 00110100
    • .read(char[] cbuf) : 파라미터로 전달된 char 배열2byte씩 읽어온 데이터를 저장한다.
  • Writer
    • 문자 기반 출력 스트림의 최상위 추상 클래스.
    • 하위 클래스는 __Writer 의 이름을 가진다. ex) FileWriter
    • .write(int c), .write(char[] cbuf), .write(String str) 등등 : 파라미터로 전달된 데이터를 2byte씩(char) 전송한다.

 


3. Java의 보조 Stream(필터 Stream)

다른 Stream과 연결되어 여러가지 편의 기능을 제공하는 Stream. 

출처: https://hudi.blog

InputStreamReader

  • InputStreamReader 클래스바이트 입력 스트림인 InputStream문자 입력 스트림인 Reader 스트림으로 변환하는 스트림.(InputStreamReader : InputStream -> Reader)
InputStream inputStream = new FileInputStream(filePath);
Reader reader = new InputStreamReader(inputStream);

 

OutputStreamWriter

  • OutputStreamWriter 클래스바이트 출력 스트림인 OutputStream문자 출력 스트림인 Writer 스트림으로 변환하는 스트림. (OutputStreamWriter : OutputStream -> Writer)
InputStream inputStream = new FileInputStream(filePath);
Reader reader = new InputStreamReader(inputStream);

 

Buffer(버퍼)

 데이터를 임시로 모아두고, 일정 크기가 되었을 때 한번에 내보내기 위해 사용. (연산 장치와 보조 기억 장치의 속도 차이를 개선)

출처: https://hudi.blog

 

BufferedInputStream

  • 바이트 단위로 파일을 읽을 때 속도를 향상시키기 위해 사용.
  • 바이너리 파일을 읽을 때 사용.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) {
            int byteData;
            while ((byteData = bis.read()) != -1) {
                System.out.print((char) byteData); // 읽은 바이트를 문자로 출력
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

BufferedReader

  • 문자 단위로 파일을 읽을 때 속도를 높이기 위해 사용.
  • 텍스트 파일을 읽을 때 사용.
  • readLine() : \r, \n으로 구분된 행 단위의 문자열(한 줄 단위)을 한꺼번에 가져올 수 있다. 데이터 다 읽으면 null을 return.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line); // 한 줄씩 출력
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

BufferedOutputStream

  • 바이트 단위로 데이터를 파일에 쓸 때 속도를 향상시키기 위해 사용.
  • 바이너리 파일(이미지, 오디오)을 파일에 출력할 때 사용.
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamExample {
    public static void main(String[] args) {
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
            String data = "Hello, World!";
            bos.write(data.getBytes()); // 문자열을 바이트 배열로 변환하여 출력
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

BufferedWriter

  • 문자 단위로 파일에 데이터를 쓸 때 속도를 높이기 위해 사용.
  • 텍스트 데이터를 파일에 출력할 때 사용.
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
            String data = "Hello, World!";
            bw.write(data); // 문자열을 출력
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

* Stream 상속 관계 

 

 


 

 

2024.08.29 - [Java/연습 문제] - [Java 연습 문제] Text file 입출력

 

[Java 연습 문제] Text file 입출력

문제텍스트 파일의 이름을 main 함수의 argument로 받아서 파일의 내용을 요약해서 출력.터미널에서 java FileDetails Yesterday.txt 하면 txt파일을 넘겨주면서 실행한다. Text file/* Yesterday.txt */YesterdayYesterda

lightningtech.tistory.com

 

2024.08.30 - [Java/연습 문제] - [Java 연습 문제] 텍스트 파일의 소문자 복사본 생성

 

[Java 연습 문제] 텍스트 파일의 소문자 복사본 생성

문제텍스트 파일의 이름을 입력 받아 파일을 읽은 후, 읽은 파일의 모든 문자를 소문바로 변경한 복사본을 생성하는 프로그램을 작성하시오. 코드import java.io.*;import java.util.Scanner;public class CopyFi

lightningtech.tistory.com

 

2024.09.08 - [Java/연습 문제] - [Java 연습문제] Iterable과 Comparable * - Book 예제

 

[Java 연습문제] Iterable과 Comparable * - Book 예제

"book.csv"을 읽어서 Book 객체로 변환한 후, 이를 LinkedList에 저장한다. Books 클래스는 Iterator 패턴을 통해 for-each문으로 쉽게 순회할 수 있다. 코드 book.csv더보기더보기더보기더보기더보기1|이노베

lightningtech.tistory.com

 

 

참고 및 출처

https://hudi.blog/java-inputstream-outputstream/

https://hudi.blog/java-filter-stream/

'Java' 카테고리의 다른 글

[Java] Naming Convention: Camel Case, Pascal Case  (0) 2024.11.06
[Java] String, StringBuilder, StringBuffer  (1) 2024.10.06
[Java] Java Logging  (0) 2024.09.11
[Java] Maven (메이븐)  (2) 2024.09.11
[Java] 14. Collections Framework  (0) 2024.09.02