어제 오늘 내일

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

IT/Java

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

hi.anna 2021. 6. 6. 14:38

 

Java API를 이용하여, 파일을 다루는 방법을 알아보고 있습니다.

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

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

[Java] 파일에 텍스트 쓰기

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

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

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

[Java] 디렉토리 생성하기

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

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

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

[Java] Text 파일 라인수 세기

 

이번에는,

텍스트 파일의 마지막 라인을 읽는 방법,

텍스트 파일의 끝에서 n개의 라인을 읽는 방법을 소개합니다.

  1. RandomAccessFile ( Java API)
    • 마지막 라인 읽기
    • 끝에서 3줄 읽기
  2. ReversedLinesFileReader ( Apache Common IO )
    • 마지막 라인 읽기
    • 끝에서 3줄 읽기

 

0. 텍스트 파일 준비

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

line 1
line 2
line 3
line 4
line 5

 

 

 

1. RandomAccessFile ( Java API)

java.io.RandomAccessFile 클래스를 사용하면,

파일 포인터를 이용하여, 파일의 임의의 위치에 접근할 수 있습니다.

 

  1.1 마지막 라인 읽기  

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class ReadLastLine {
    public static void main(String[] args) {
        
        try {
            // 1. RandomAcessFile, 마지막 라인을 담을 String
            RandomAccessFile randomAccessFile = new RandomAccessFile("d:\\example\\text_file.txt", "r");
            StringBuffer lastLine = new StringBuffer();

            // 2. 전체 파일 길이
            long fileLength = randomAccessFile.length();

            // 3. 포인터를 이용하여 뒤에서부터 앞으로 데이터를 읽는다.
            for (long pointer = fileLength - 1; pointer >= 0; pointer--) {

                // 3.1. pointer를 읽을 글자 앞으로 옮긴다.
                randomAccessFile.seek(pointer);

                // 3.2. pointer 위치의 글자를 읽는다.
                char c = (char) randomAccessFile.read();

                // 3.3. 줄바꿈이 나타나면 더 이상 글자를 읽지 않는다.
                if (c == '\n') {
                    break;
                }

                // 3.4. 결과 문자열의 앞에 읽어온 글자(c)를 붙여준다.
                lastLine.insert(0, c);
            }

            // 4. 결과 출력
            System.out.println(lastLine);  // line 5

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

  1.1 결과  

line 5

 

 

  1.2 끝에서 3줄 읽기  

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class ReadLastLine {
    public static void main(String[] args) {
        
        try {
            // 1. RandomAcessFile, 마지막 라인을 담을 String, 읽을 라인 수
            RandomAccessFile randomAccessFile = new RandomAccessFile("d:\\example\\text_file.txt", "r");
            StringBuffer lastLine = new StringBuffer();
            int lineCount = 3;

            // 2. 전체 파일 길이
            long fileLength = randomAccessFile.length();

            // 3. 포인터를 이용하여 뒤에서부터 앞으로 데이터를 읽는다.
            for (long pointer = fileLength - 1; pointer >= 0; pointer--) {

                // 3.1. pointer를 읽을 글자 앞으로 옮긴다.
                randomAccessFile.seek(pointer);

                // 3.2. pointer 위치의 글자를 읽는다.
                char c = (char) randomAccessFile.read();

                // 3.3. 줄바꿈이 3번(lineCount) 나타나면 더 이상 글자를 읽지 않는다.
                if (c == '\n') {
                    lineCount--;
                    if (lineCount == 0) {
                        break;
                    }
                }

                // 3.4. 결과 문자열의 앞에 읽어온 글자(c)를 붙여준다.
                lastLine.insert(0, c);
            }

            // 4. 결과 출력
            System.out.println(lastLine);

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

  1.2 결과  

line 3
line 4
line 5

 

 

 

2. ReversedLinesFileReader ( Apache Common IO )

Apache Common IO의 ReversedLinesFileReader 클래스는

파일을 뒤에서부터 거꾸로 읽어줍니다.

다음의 2가지 메소드를 사용하여, 뒤에서부터 파일을 읽을 수 있습니다.

 

public String readLine()

파일의 뒤에서 1줄을 읽어서 리턴합니다.

 

만약, 더 이상 읽을 라인이 없으면(파일의 시작점에 도착하면) null을 리턴합니다.
public List<String> readLines(int lineCount)

파일의 뒤에서, 파라미터로 전달된 lineCount만큼 라인을 읽어서 리턴합니다.

만약, 파라미터로 전달된 line수보다 실제 라인수가 더 적으면,

실제 라인수만큼만 읽어서 데이터를 리턴합니다.

 

  2.1 마지막 라인 읽기  

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.io.input.ReversedLinesFileReader;

public class ReadLastLine {
    public static void main(String[] args) {

        // 0. 파일 준비
        File file = new File("D:\\example\\text_file.txt");

        try {

            // 1. ReversedLinesFileReader  준비
            ReversedLinesFileReader reader 
                    = new ReversedLinesFileReader(file, Charset.forName("UTF-8"));
                
            // 2. 뒤에서 1줄 읽기
            String lastLine = reader.readLine();
            
            // 3. 결과 출력
            System.out.println(lastLine);

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

  2.1 결과  

line 5

 

 

  2.2 끝에서 3줄 읽기  

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;

import org.apache.commons.io.input.ReversedLinesFileReader;

public class ReadLastLine {
    public static void main(String[] args) {

        // 0. 파일 준비
        File file = new File("D:\\example\\text_file.txt");

        try {

            // 1. ReversedLinesFileReader  준비
            ReversedLinesFileReader reader 
                    = new ReversedLinesFileReader(file, Charset.forName("UTF-8"));
                
            // 2. 뒤에서 3줄 읽기
            List<String> lines = reader.readLines(3);
            
            // 3. 결과 출력
            System.out.println(lines);  // [line 5, line 4, line 3]

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

  2.2 결과  

[line 5, line 4, line 3]

 


 

Java API와 Apache Common IO를 이용하여

파일을 뒤에서부터 읽는 방법을 알아보았습니다.

 

 

 

반응형

'IT > Java' 카테고리의 다른 글

[Java] 배열 합치기  (0) 2021.06.06
[Java] 파일 특정 라인 읽기  (0) 2021.06.06
[Java] Text 파일 라인수 세기  (0) 2021.06.06
[Java] 파일 최종수정일자 변경하기  (0) 2021.06.05
[Java] 파일의 최종 수정일자 조회  (0) 2021.06.05
Comments