Java에서 파일을 읽어오는 방법에 대해 알아보자.
파일을 읽어오기 위해 가장 중요한 것은 파일의 위치를 정확히 지정하는 것이다.
예를 들어, 아래와 같은 디렉토리 구조를 가진 프로젝트가 있다고 가정하자.
src/
├─ main/
│ ├─ java/
│ │ ├─ com.example.Main.java
│ ├─ resources/
│ ├─ test.txt
여기서 test.txt
파일은 src/main/resources/
디렉토리 아래에 위치하며,
이는 클래스패스(classpath)로 지정된 경로에 포함된다.
정적 리소스 파일을 처리하는 방법
Java에서는 Path
객체를 생성하고 Java NIO API를 이용하여 파일의 내용을 문자열로 읽어올 수 있다.
이를 위한 코드는 다음과 같다.
private List<String> readFile(String fileName) throws IOException, URISyntaxException {
Path path = Paths.get(Objects.requireNonNull(getClass().getClassLoader().getResource(fileName)).toURI());
String rawFileInput = Files.readString(path);
return separateLines(rawFileInput);
}
이 코드는 클래스패스(classpath)를 기준으로 지정된 파일의 경로를 찾은 뒤, 파일 내용을 읽어 문자열로 반환하는 작업을 수행한다.
1. getClass().getClassLoader().getResource(fileName)
를 통해 클래스 로더가 파일의 URL을 검색한다.
2. URL을 URI로 변환하고, 이를 다시 Path
객체로 변환한다.
3. 마지막으로, Files.readString(path)
를 사용해 파일의 내용을 문자열로 읽어온다.
별도의 인코딩을 지정하지 않으면 기본적으로 UTF-8 인코딩이 사용된다.
이 메서드는 URISyntaxException
과 IOException
이라는 Checked Exception을 발생시킬 수 있으므로 이를 처리해야 한다. 다음은 예외를 처리하는 코드이다.
public List<String> readRule() {
try {
return readFile("PROMOTION.txt");
} catch (IOException | URISyntaxException e) {
throw new InputException(FILE_READ_FAIL);
}
}
위 코드는 readFile
메서드에서 발생한 예외를 잡아 사용자 정의 예외인 InputException
으로 변환하여 호출자에게 전달한다.
파일 내용을 줄 단위로 변환하기 위해서는 별도의 헬퍼 메서드를 작성할 수 있다.
다음은 문자열을 한 줄씩 읽어 리스트로 변환하는 코드이다.
private List<String> separateLines(String rawString) {
List<String> result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new StringReader(rawString))) {
String line = br.readLine();
while (line != null) {
result.add(line);
line = br.readLine();
}
} catch (IOException e) {
throw new InputException(FILE_READ_FAIL);
}
return result;
}
이 코드는 BufferedReader
와 StringReader
를 사용하여 문자열 데이터를 줄 단위로 읽어들인다.
이를 통해 파일 내용을 줄 단위로 리스트에 저장하여 반환할 수 있다.
이 과정에서도 발생 가능한 IOException
을 처리해 사용자 정의 예외로 변환한다.
동적 리소스 파일을 처리하는 방법
정적 리소스 파일을 처리하는 방법 외에도 프로그램 실행 중 동적으로 결정되는 파일을 처리할 수도 있다.
동적 파일을 처리할 때는 파일이 존재하지 않을 가능성에 대비한 추가적인 예외 처리가 필요하다.
public List<String> readDynamicFile(String filePath) {
Path path = Paths.get(filePath);
if (!Files.exists(path)) {
throw new InputException(FILE_NOT_FOUND);
}
try {
String rawFileInput = Files.readString(path);
return separateLines(rawFileInput);
} catch (IOException e) {
throw new InputException(FILE_READ_FAIL);
}
}
이 코드는 먼저 Files.exists(path)
를 사용해 파일이 존재하는지 확인한다.
파일이 없으면 InputException
을 던져 적절히 처리한다.
이후 Paths.get(filePath)
를 통해 동적 경로를 처리하고, Files.readString
으로 파일 내용을 읽어와 반환한다.
'Java' 카테고리의 다른 글
ArrayList와 LinkedList의 차이 (0) | 2025.02.25 |
---|---|
리스트에서 중복 요소를 확인하는 방법 (0) | 2024.11.27 |
일급 컬렉션(first class collection)이 뭘까? (0) | 2024.10.29 |
Java Primitive Type(1) - boolean, char (0) | 2024.04.22 |