어제 오늘 내일

[Java] 파일 특정 라인 읽기 본문

IT/Java

[Java] 파일 특정 라인 읽기

hi.anna 2021. 6. 6. 15:53

 

Java에서 파일을 다루는 방법을 알아보고 있습니다.

[Java] 파일 생성하는 3가지 방법 (File, FileOutputStream, Files)

[Java] 파일, 디렉토리 존재 여부 확인하기

[Java] 파일에 텍스트 쓰기

[Java] 파일, 디렉토리 삭제하기

[Java] 현재 디렉토리 가져오기

[Java] 파일 사이즈 구하는 3가지 방법

[Java] 디렉토리 생성하기

[Java] 파일 또는 디렉토리 생성일자 구하기

[Java] 파일의 최종 수정일자 조회

[Java] 파일 최종수정일자 변경하기

[Java] Text 파일 라인수 세기

[Java] 텍스트 파일의 마지막 라인부터 읽기

 

이번에는, 파일의 특정 라인을 읽는 방법을 알아보도록 하겠습니다.

  1. Files.readAllLines().get() - 파일 사이즈가 작을 경우
  2. Files.lines.skip() - 파일 사이즈가 클 경우
  3. Apache Common IO

 

 

0. 테스트 파일 준비

테스트를 위한 텍스트 파일("text_file.txt")을 준비합니다.

line 1
line 2
line 3
line 4
line 5

 

 

1. Files.readAllLines().get() - 파일 사이즈가 작을 경우

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class ReadNthLine {
    public static void main(String[] args) {
        
        // 0. 파일 준비
        Path path = Paths.get("D:\\example\\text_file.txt");
        
        try {

            // 1. 파일 전체 읽기
            List<String> allLines = Files.readAllLines(path);

            // 2. 3번째 라인 읽기
            String nthLine = allLines.get(2);

            // 3. 결과 출력
            System.out.println(nthLine);  // line 3

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

List<String> allLines = Files.readAllLines(path);

readAllLines() 메소드는 파일의 모든 라인을 읽어서 List로 리턴합니다.

그리고, 우리는 결과로 받은 List에서 우리가 원하는 라인의 문자열을 꺼내서 쓸수 있습니다.

간결하지만, 파일이 클 경우, 파일 전체의 내용이 메모리에 다 올라가기 때문에 

위 방법은 파일이 작은 경우 유용합니다.

 

 

 

2. Files.lines.skip() - 파일 사이즈가 클 경우

파일 사이즈가 클 경우, Stream을 사용해서, 특정 라인을 읽어올 수 있습니다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ReadNthLine {
    public static void main(String[] args) {
        
        // 0. 파일 준비
        Path path = Paths.get("D:\\example\\text_file.txt");
        
        try {

            // 1. 파일 Stream 생성
            Stream<String> stream = Files.lines(path);

            // 2. 3번째 라인 찾기
            String nthLine = stream.skip(2).findFirst().get();

            // 3. 결과 출력
            System.out.println(nthLine);  // line 3

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

Stream<String> stream = Files.lines(path);

Stream으로 파일의 모든 라인을 리턴합니다.

 

String nthLine = stream.skip(2).findFirst().get();

skip(n) - n개의 element를 제거한 후, 나머지 element로 구성된 stream을 리턴합니다.

즉, 여기서는 2번째 라인까지를 제거한 후, 3번째 라인부터 나머지 요소로 구성된 stream을 리턴합니다.

findFirst() - stream의 1번째 element를 나타내는 Optional을 리턴합니다.

get() - Optional의 값이 존재하면, 해당 값을 리턴합니다.

 

 

 

3. Apache Common IO

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.commons.io.FileUtils;

public class ReadNthLine {
    public static void main(String[] args) {
        
        // 0. 파일 준비
        File file = new File("D:\\example\\text_file.txt");
        
        try {

            // 1. 파일 전체 읽기
            List<String> lines = FileUtils.readLines(file, "UTF-8");

            // 2. 3번째 라인 찾기
            String nthLine = lines.get(2);

            // 3. 결과 출력
            System.out.println(nthLine);  // line 3

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

 


 

Java에서 파일의 특정 라인을 읽는 방법을 알아보았습니다.

 

 

 

반응형
Comments