Java.io 패키지 정리

유방현·2024년 10월 28일
post-thumbnail

자바의 java.io 패키지는 입출력(IO)을 처리하는데 필수적인 클래스들을 제공합니다. 이 패키지는 데이터의 입출력 처리와 관련된 다양한 스트림 클래스를 포함하고 있어, 프로그램이 파일, 네트워크, 메모리 등에서 데이터를 읽고 쓰는 작업을 간단하게 처리할 수 있게 도와줍니다.

1. 스트림(Stream)의 기본 개념

1.1 스트림의 정의

  • 데이터의 입출력을 처리하는 통로
  • 단방향 데이터 흐름
  • 연속적인 데이터의 흐름을 처리

1.2 스트림의 종류

  1. 방향에 따른 구분

    • 입력 스트림 (InputStream, Reader)
    • 출력 스트림 (OutputStream, Writer)
  2. 데이터 종류에 따른 구분

    • 바이트 스트림 (InputStream, OutputStream)
    • 문자 스트림 (Reader, Writer)

2. 바이트 스트림 (Byte Stream)

2.1 InputStream 클래스

public class ByteStreamExample {
    public void readBytes() throws IOException {
        FileInputStream fis = new FileInputStream("test.dat");
        try {
            int data;
            while ((data = fis.read()) != -1) {
                // 바이트 데이터 처리
            }
        } finally {
            fis.close();
        }
    }
}

2.2 OutputStream 클래스

public class ByteOutputExample {
    public void writeBytes() throws IOException {
        FileOutputStream fos = new FileOutputStream("test.dat");
        try {
            String data = "Hello, World!";
            fos.write(data.getBytes());
        } finally {
            fos.close();
        }
    }
}

3. 문자 스트림 (Character Stream)

3.1 Reader 클래스

public class ReaderExample {
    public void readChars() throws IOException {
        FileReader reader = new FileReader("test.txt");
        try {
            int character;
            while ((character = reader.read()) != -1) {
                // 문자 데이터 처리
                System.out.print((char) character);
            }
        } finally {
            reader.close();
        }
    }
}

3.2 Writer 클래스

public class WriterExample {
    public void writeChars() throws IOException {
        FileWriter writer = new FileWriter("test.txt");
        try {
            String text = "안녕하세요!";
            writer.write(text);
        } finally {
            writer.close();
        }
    }
}

4. 버퍼링 스트림 (Buffered Stream)

4.1 BufferedInputStream/BufferedOutputStream

public class BufferedStreamExample {
    public void copyFile() throws IOException {
        try (BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("source.file"));
             BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("target.file"))) {
            
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
        }
    }
}

4.2 BufferedReader/BufferedWriter

public class BufferedReaderWriterExample {
    public void processLines() throws IOException {
        try (BufferedReader reader = new BufferedReader(
                new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(
                new FileWriter("output.txt"))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
        }
    }
}

5. 데이터 스트림 (Data Stream)

5.1 DataInputStream/DataOutputStream

public class DataStreamExample {
    public void writeData() throws IOException {
        try (DataOutputStream dos = new DataOutputStream(
                new FileOutputStream("data.bin"))) {
            dos.writeInt(123);
            dos.writeDouble(3.14);
            dos.writeUTF("Hello");
        }
    }

    public void readData() throws IOException {
        try (DataInputStream dis = new DataInputStream(
                new FileInputStream("data.bin"))) {
            int number = dis.readInt();
            double value = dis.readDouble();
            String text = dis.readUTF();
        }
    }
}

6. 객체 직렬화 (Object Serialization)

6.1 ObjectInputStream/ObjectOutputStream

public class SerializationExample {
    public void serialize() throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("object.ser"))) {
            MyClass obj = new MyClass();
            oos.writeObject(obj);
        }
    }

    public void deserialize() throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("object.ser"))) {
            MyClass obj = (MyClass) ois.readObject();
        }
    }
}

7. 파일 관련 클래스

7.1 File 클래스

public class FileExample {
    public void fileOperations() {
        File file = new File("example.txt");
        
        // 파일 정보 확인
        System.out.println("존재 여부: " + file.exists());
        System.out.println("파일 크기: " + file.length());
        System.out.println("읽기 가능: " + file.canRead());
        System.out.println("쓰기 가능: " + file.canWrite());
        
        // 디렉토리 생성
        File dir = new File("newDir");
        dir.mkdir();
        
        // 파일 목록 조회
        File[] files = dir.listFiles();
    }
}

7.2 RandomAccessFile 클래스

public class RandomAccessFileExample {
    public void randomAccess() throws IOException {
        try (RandomAccessFile file = new RandomAccessFile("random.dat", "rw")) {
            // 파일 포인터 이동
            file.seek(1000);
            
            // 데이터 쓰기
            file.writeInt(123);
            
            // 파일 포인터 처음으로 이동
            file.seek(0);
            
            // 데이터 읽기
            int value = file.readInt();
        }
    }
}

8. 스트림 체이닝 활용

8.1 다중 스트림 조합

public class StreamChainingExample {
    public void chainedStream() throws IOException {
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream("input.txt"), "UTF-8"))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 처리 로직
            }
        }
    }
}

Java의 I/O 패키지에 대해 자세히 정리해드리겠습니다.

Java I/O 패키지 종합 가이드

1. 스트림(Stream)의 기본 개념

1.1 스트림의 정의

  • 데이터의 입출력을 처리하는 통로
  • 단방향 데이터 흐름
  • 연속적인 데이터의 흐름을 처리

1.2 스트림의 종류

  1. 방향에 따른 구분

    • 입력 스트림 (InputStream, Reader)
    • 출력 스트림 (OutputStream, Writer)
  2. 데이터 종류에 따른 구분

    • 바이트 스트림 (InputStream, OutputStream)
    • 문자 스트림 (Reader, Writer)

2. 바이트 스트림 (Byte Stream)

2.1 InputStream 클래스

public class ByteStreamExample {
    public void readBytes() throws IOException {
        FileInputStream fis = new FileInputStream("test.dat");
        try {
            int data;
            while ((data = fis.read()) != -1) {
                // 바이트 데이터 처리
            }
        } finally {
            fis.close();
        }
    }
}

2.2 OutputStream 클래스

public class ByteOutputExample {
    public void writeBytes() throws IOException {
        FileOutputStream fos = new FileOutputStream("test.dat");
        try {
            String data = "Hello, World!";
            fos.write(data.getBytes());
        } finally {
            fos.close();
        }
    }
}

3. 문자 스트림 (Character Stream)

3.1 Reader 클래스

public class ReaderExample {
    public void readChars() throws IOException {
        FileReader reader = new FileReader("test.txt");
        try {
            int character;
            while ((character = reader.read()) != -1) {
                // 문자 데이터 처리
                System.out.print((char) character);
            }
        } finally {
            reader.close();
        }
    }
}

3.2 Writer 클래스

public class WriterExample {
    public void writeChars() throws IOException {
        FileWriter writer = new FileWriter("test.txt");
        try {
            String text = "안녕하세요!";
            writer.write(text);
        } finally {
            writer.close();
        }
    }
}

4. 버퍼링 스트림 (Buffered Stream)

4.1 BufferedInputStream/BufferedOutputStream

public class BufferedStreamExample {
    public void copyFile() throws IOException {
        try (BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("source.file"));
             BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("target.file"))) {
            
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
        }
    }
}

4.2 BufferedReader/BufferedWriter

public class BufferedReaderWriterExample {
    public void processLines() throws IOException {
        try (BufferedReader reader = new BufferedReader(
                new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(
                new FileWriter("output.txt"))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
        }
    }
}

5. 데이터 스트림 (Data Stream)

5.1 DataInputStream/DataOutputStream

public class DataStreamExample {
    public void writeData() throws IOException {
        try (DataOutputStream dos = new DataOutputStream(
                new FileOutputStream("data.bin"))) {
            dos.writeInt(123);
            dos.writeDouble(3.14);
            dos.writeUTF("Hello");
        }
    }

    public void readData() throws IOException {
        try (DataInputStream dis = new DataInputStream(
                new FileInputStream("data.bin"))) {
            int number = dis.readInt();
            double value = dis.readDouble();
            String text = dis.readUTF();
        }
    }
}

6. 객체 직렬화 (Object Serialization)

6.1 ObjectInputStream/ObjectOutputStream

public class SerializationExample {
    public void serialize() throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("object.ser"))) {
            MyClass obj = new MyClass();
            oos.writeObject(obj);
        }
    }

    public void deserialize() throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("object.ser"))) {
            MyClass obj = (MyClass) ois.readObject();
        }
    }
}

7. 파일 관련 클래스

7.1 File 클래스

public class FileExample {
    public void fileOperations() {
        File file = new File("example.txt");
        
        // 파일 정보 확인
        System.out.println("존재 여부: " + file.exists());
        System.out.println("파일 크기: " + file.length());
        System.out.println("읽기 가능: " + file.canRead());
        System.out.println("쓰기 가능: " + file.canWrite());
        
        // 디렉토리 생성
        File dir = new File("newDir");
        dir.mkdir();
        
        // 파일 목록 조회
        File[] files = dir.listFiles();
    }
}

7.2 RandomAccessFile 클래스

public class RandomAccessFileExample {
    public void randomAccess() throws IOException {
        try (RandomAccessFile file = new RandomAccessFile("random.dat", "rw")) {
            // 파일 포인터 이동
            file.seek(1000);
            
            // 데이터 쓰기
            file.writeInt(123);
            
            // 파일 포인터 처음으로 이동
            file.seek(0);
            
            // 데이터 읽기
            int value = file.readInt();
        }
    }
}

8. 스트림 체이닝 활용

8.1 다중 스트림 조합

public class StreamChainingExample {
    public void chainedStream() throws IOException {
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream("input.txt"), "UTF-8"))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 처리 로직
            }
        }
    }
}

이러한 Java I/O 패키지의 주요 특징 및 사용시 고려사항은 다음과 같습니다:

  1. 성능 고려사항:

    • 버퍼링 사용으로 성능 향상
    • 적절한 버퍼 크기 선택
    • 리소스 적절한 해제
  2. 에러 처리:

    • try-with-resources 구문 활용
    • 적절한 예외 처리
    • 리소스 누수 방지
  3. 인코딩 고려:

    • 문자셋 지정
    • 플랫폼 독립적 처리
    • 국제화 지원
  4. 보안 고려사항:

    • 파일 접근 권한 확인
    • 보안 정책 준수
    • 민감한 데이터 처리

실무에서 자주 사용되는 패턴:

  • 로그 파일 처리
  • 설정 파일 입출력
  • 대용량 데이터 처리
  • 네트워크 통신
  • 임시 파일 처리

0개의 댓글