Java Study

TIL-자바 스트림

초코너무조코 2025. 1. 17. 11:53
728x90

 

목차

    자바 스트림(Stream): 문자 기반 스트림과 바이트 기반 스트림

    자바의 스트림(Stream)은 데이터를 읽거나 쓰는 통로로, 파일, 네트워크, 메모리 등에서 데이터를 처리할 때 사용됩니다. 스트림은 크게 문자 기반 스트림바이트 기반 스트림으로 나뉩니다.


    1. 스트림의 종류

    • 바이트 기반 스트림 (Byte Stream): 데이터를 1바이트(8비트) 단위로 처리합니다. 이미지, 동영상, 음악 등 바이너리 데이터를 처리할 때 사용됩니다.
    • 문자 기반 스트림 (Character Stream): 데이터를 문자 단위(2바이트)로 처리합니다. 텍스트 데이터를 읽고 쓸 때 적합합니다.

    2. 바이트 기반 스트림

    바이트 기반 스트림은 바이너리 데이터를 처리하며, 주요 클래스는 다음과 같습니다:

    • FileInputStream: 파일에서 데이터를 바이트 단위로 읽음.
    • FileOutputStream: 파일에 데이터를 바이트 단위로 씀.

    예제: 이미지 파일 복사

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (
                FileInputStream fis = new FileInputStream("source.jpg");
                FileOutputStream fos = new FileOutputStream("copy.jpg")
            ) {
                byte[] buffer = new byte[1024];  // 1KB 버퍼
                int bytesRead;
    
                while ((bytesRead = fis.read(buffer)) != -1) { // 파일 끝까지 읽기
                    fos.write(buffer, 0, bytesRead);          // 읽은 데이터를 쓰기
                }
    
                System.out.println("이미지 복사 완료!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    3. 문자 기반 스트림

    문자 기반 스트림은 텍스트 데이터를 처리하며, 주요 클래스는 다음과 같습니다:

    • FileReader: 파일에서 문자를 읽음.
    • FileWriter: 파일에 문자를 씀.

    예제: 텍스트 파일 읽기

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileReader reader = new FileReader("input.txt")) {
                int data;
                while ((data = reader.read()) != -1) {  // 한 문자씩 읽기
                    System.out.print((char) data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    예제: 텍스트 파일 쓰기

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileWriter writer = new FileWriter("output.txt")) {
                writer.write("안녕하세요, 자바 스트림!");  // 문자열 쓰기
                writer.write("\n이것은 문자 기반 스트림 예제입니다.");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    4. 보조 스트림(Decorated Stream)

    보조 스트림은 기본 스트림에 추가 기능을 제공하여 성능을 향상하거나 데이터를 효율적으로 처리합니다. 단독으로 사용할 수 없으며 반드시 기본 스트림과 함께 사용해야 합니다.

    보조 스트림의 종류

    • BufferedInputStream, BufferedOutputStream: 버퍼링으로 성능 향상 (바이트 기반).
    • BufferedReader, BufferedWriter: 문자를 효율적으로 처리 (문자 기반).

    예제: BufferedReader로 파일 읽기

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
                String line;
                while ((line = br.readLine()) != null) {  // 한 줄씩 읽기
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    5. 바이트 스트림 vs 문자 스트림

    구분 바이트 스트림 문자 스트림
    데이터 단위 1바이트 (8비트) 1문자 (2바이트, 유니코드)
    사용 데이터 바이너리 데이터 (이미지, 동영상 등) 텍스트 데이터 (문자, 문자열 등)
    대표 클래스 FileInputStream, FileOutputStream FileReader, FileWriter

    6. 결론

    자바 스트림은 데이터를 읽고 쓰는 가장 기본적인 도구로, 작업 대상 데이터에 따라 바이트 기반 또는 문자 기반 스트림을 선택해야 합니다. 또한, 보조 스트림을 활용하면 성능 향상과 효율적인 데이터 처리가 가능합니다.

    자바 스트림 종류와 예제: 바이트 스트림과 문자 스트림

    각 스트림의 종류와 예제를 소개합니다.


    1. 바이트 스트림

    바이트 스트림은 데이터를 1바이트(8비트) 단위로 처리합니다. 이미지, 동영상, 음악 파일 같은 바이너리 데이터를 처리할 때 사용됩니다.

    1.1 InputStream (입력 스트림)

    • FileInputStream: 파일에서 데이터를 바이트 단위로 읽음.
    • BufferedInputStream: 버퍼링을 통해 읽기 성능을 향상.
    • DataInputStream: 기본 데이터 타입(int, double 등)을 읽음.
    • ObjectInputStream: 객체를 읽음 (역직렬화).
    • ByteArrayInputStream: 바이트 배열로부터 데이터를 읽음.

    예제: FileInputStream 사용

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileInputStream fis = new FileInputStream("example.txt")) {
                int data;
                while ((data = fis.read()) != -1) { // 한 바이트씩 읽기
                    System.out.print((char) data); // 바이트를 문자로 출력
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    1.2 OutputStream (출력 스트림)

    • FileOutputStream: 파일에 데이터를 바이트 단위로 씀.
    • BufferedOutputStream: 버퍼링을 통해 쓰기 성능을 향상.
    • DataOutputStream: 기본 데이터 타입(int, double 등)을 씀.
    • ObjectOutputStream: 객체를 씀 (직렬화).
    • ByteArrayOutputStream: 데이터를 바이트 배열로 저장.

    예제: FileOutputStream 사용

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileOutputStream fos = new FileOutputStream("output.txt")) {
                String data = "Hello, Byte Stream!";
                fos.write(data.getBytes()); // 문자열을 바이트 배열로 변환 후 쓰기
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    2. 문자 스트림

    문자 스트림은 데이터를 문자 단위(2바이트, 유니코드 기반)로 처리합니다. 텍스트 데이터를 읽고 쓸 때 사용됩니다.

    2.1 Reader (입력 스트림)

    • FileReader: 파일에서 문자를 읽음.
    • BufferedReader: 버퍼링을 통해 읽기 성능을 향상하며, readLine() 메서드 제공.
    • InputStreamReader: 바이트 스트림을 문자 스트림으로 변환.
    • StringReader: 문자열로부터 데이터를 읽음.

    예제: FileReader 사용

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileReader reader = new FileReader("input.txt")) {
                int data;
                while ((data = reader.read()) != -1) { // 한 문자씩 읽기
                    System.out.print((char) data);    // 문자 출력
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    2.2 Writer (출력 스트림)

    • FileWriter: 파일에 문자를 씀.
    • BufferedWriter: 버퍼링을 통해 쓰기 성능을 향상하며, newLine() 메서드 제공.
    • OutputStreamWriter: 바이트 스트림을 문자 스트림으로 변환.
    • StringWriter: 문자열에 데이터를 씀.

    예제: FileWriter 사용

    
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) {
            try (FileWriter writer = new FileWriter("output.txt")) {
                writer.write("안녕하세요, 문자 스트림!");
                writer.write("\nJava I/O is fun!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    3. 바이트 스트림 vs 문자 스트림

    구분 바이트 스트림 문자 스트림
    데이터 단위 1바이트 (8비트) 1문자 (2바이트, 유니코드)
    사용 데이터 바이너리 데이터 (이미지, 비디오 등) 텍스트 데이터 (문자, 문자열)
    대표 입력 클래스 FileInputStream, BufferedInputStream FileReader, BufferedReader
    대표 출력 클래스 FileOutputStream, BufferedOutputStream FileWriter, BufferedWriter

    4. 결론

    자바 스트림은 데이터를 읽고 쓰는 가장 기본적인 도구로, 작업 대상 데이터에 따라 바이트 스트림 또는 문자 스트림을 선택해야 합니다.

    선택 기준:

    • 텍스트 데이터를 처리해야 한다면 문자 스트림을 사용하세요.
    • 이미지, 동영상, 음악 파일 등 바이너리 데이터를 처리해야 한다면 바이트 스트림을 사용하세요.
    728x90

    'Java Study' 카테고리의 다른 글

    Java Enum 정리  (1) 2025.01.22
    TIL- 자바 형변환 총정리  (0) 2025.01.22
    자바의 정석 개인적 공부 요약  (1) 2025.01.15
    TIL- Java Generics  (0) 2025.01.15
    TIL - 깊은 복사 vs 얕은 복사  (0) 2025.01.07