Java IO 사용시 마주하는 흔한 실수나 문제점

버퍼링 없다면 성능 문제를 마주할 수 있다.

대부분의 경우, IO 성능을 향상시키기 위해 버퍼링을 사용해야 합니다. BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream 등의 클래스를 사용하여 입출력 작업을 버퍼링할 수 있습니다. 이는 많은 작은 IO 작업을 하나의 큰 작업으로 묶어 성능을 개선시키는 데 도움이 됩니다.

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        // 처리
    }
} catch (IOException e) {
    // 예외 처리
}

버퍼 오버플로우

버퍼 크기를 초과하여 데이터를 읽거나 쓰는 경우 예상치 못한 동작이 발생할 수 있습니다

import java.io.FileInputStream;
import java.io.IOException;

public class BufferOverflowExample {
    public static void main(String[] args) {
        String filePath = "path/to/your/file.txt"; // 실제 파일 경로로 변경해야 합니다.

        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] buffer = new byte[1024]; // 버퍼 크기를 작게 설정합니다.

            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                // 잘못된 사용 예시: 버퍼의 크기를 초과하여 데이터를 읽으려고 시도합니다.
                System.out.write(buffer, 0, buffer.length + 1); // 버퍼 크기를 초과하여 데이터를 출력하려고 함
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

버퍼 크기 고려 미흡

파일 복사 등의 작업에서 적절한 버퍼 크기를 선택하지 않아 성능에 문제가 발생할 수 있습니다.

EOF (End of File) 처리

파일의 끝에 도달했을 때를 올바르게 처리하지 않아 데이터 누락이나 무한루프에 빠지는 문제가 발생할 수 있습니다.

문자 인코딩 처리

특히 텍스트 파일을 다룰 때, 적절한 문자 인코딩을 지정하는 것이 중요합니다. 기본적으로 JVM은 플랫폼 기본 인코딩을 사용하지만, 이는 시스템 간 호환성 문제를 발생시킬 수 있습니다. 따라서 인코딩을 명시적으로 지정해 주는 것이 좋습니다.

스트림 닫기

파일이나 네트워크 연결과 같은 자원을 사용한 후에는 반드시 스트림을 닫아야 합니다. 이 작업을 하지 않으면 메모리 누수가 발생할 수 있습니다. 스트림을 닫기 위해 close() 메서드를 사용하거나 Java 7부터는 try-with-resources 구문을 활용하여 자동으로 닫히도록 할 수 있습니다.

디렉토리 처리

파일이 아닌 디렉토리를 다룰 때는 주의가 필요합니다. 파일과 디렉토리를 구분해야 하며, 디렉토리에 대해선 적절한 예외 처리와 함께 적절한 메서드를 사용해야 합니다

예외 처리

IO 작업은 파일이나 네트워크와 같은 외부 자원을 다루므로 예외가 발생할 가능성이 큽니다. IO 메서드들은 일반적으로 IOException을 던지며, 이를 적절히 처리해야 합니다. 예외 처리는 반드시 try-catch 블록 내에서 이루어져야 합니다.

Last updated