[Java] resource에 있는 파일을 읽어오는 방법

2024. 11. 27. 23:38·Java
728x90

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으로 파일 내용을 읽어와 반환한다.

728x90

'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
'Java' 카테고리의 다른 글
  • ArrayList와 LinkedList의 차이
  • 리스트에서 중복 요소를 확인하는 방법
  • 일급 컬렉션(first class collection)이 뭘까?
  • Java Primitive Type(1) - boolean, char
Hyogu
Hyogu
Hype한 백엔드 개발자 연습생
  • Hyogu
    룰루랄라
    Hyogu
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • Java (5)
      • Network (5)
      • Database (3)
      • Kubernetes (5)
      • Spring (5)
      • 백준 (15)
      • Backend (15)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    중복 요소 검사
    kube-scheduler
    일급컬렉션
    BFS
    제로 트러스트
    kubernetes
    first-class collection
    토스증권
    @Test
    dp
    코테
    java
    회고
    kuberay
    DDD
    네트워크
    알고리즘
    백준
    이중 포인터
    list
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.0
Hyogu
[Java] resource에 있는 파일을 읽어오는 방법
상단으로

티스토리툴바