Java BufferedReader 를 이용한 효율적인 텍스트 처리

JavaBeginner
지금 연습하기

소개

이 랩에서는 java.io 패키지에 속하는 Java BufferedReader 클래스를 사용합니다. BufferedReader 는 문자 입력 스트림에서 텍스트를 읽는 데 사용되며, 성능 향상을 위해 문자를 버퍼링합니다. 이 클래스는 다른 reader 클래스와 입력 스트림을 래핑하여 프로그램의 전반적인 효율성과 성능을 향상시킬 수 있습니다. BufferedReader 의 다양한 생성자, 메서드 및 사용 사례를 탐구하여 기능을 이해하고자 합니다.

FileReader 를 사용하여 BufferedReader 생성

BufferedReader 생성자는 Reader 객체를 매개변수로 받습니다. 기본 인코딩으로 텍스트 파일을 읽는 FileReader를 사용하여 reader 를 생성할 수 있습니다. 이 단계에서는 FileReader를 래핑하여 BufferedReader 클래스로 파일을 읽습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try {
            FileReader fileReader = new FileReader(path);
            BufferedReader bufferedReader = new BufferedReader(fileReader); //FileReader 를 래핑하여 BufferedReader 생성
            // 파일에서 데이터를 읽는 코드를 여기에 추가합니다.

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

코드를 실행하려면 javac BufferedReaderDemo.java로 파일을 컴파일한 다음, java BufferedReaderDemo로 실행합니다.

스트림과 함께 BufferedReader 사용

입력 스트림을 소스로 사용하여 BufferedReader를 생성할 수도 있습니다. 이 단계에서는 InputStreamReaderBufferedReader로 래핑하고 System.in 에서 데이터를 읽습니다. 이렇게 하면 키보드를 사용하여 입력하는 데이터를 읽습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(isr); //BufferedReader 생성
            System.out.println("Enter Something:");
            String line = bufferedReader.readLine(); //콘솔에서 입력 읽기
            System.out.println("You Entered: " + line); //입력 출력

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

스트림 닫기

reader 와 관련된 모든 시스템 리소스를 해제하기 위해 항상 BufferedReaderclose() 메서드를 사용해야 합니다. 코드를 단순화하기 위해 try-with-resources 블록을 사용하여 스트림을 자동으로 닫을 수 있습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            // 파일에서 데이터를 읽는 코드를 여기에 추가합니다.

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

BufferedReader vs. Scanner 비교

ScannerBufferedReader는 모두 외부 소스에서 데이터를 읽는 데 사용할 수 있습니다. 그러나 이 두 클래스 간에는 몇 가지 차이점이 있습니다. 이 단계에서는 몇 가지 주요 차이점을 비교해 보겠습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader);
             Scanner scanner = new Scanner(fileReader)) {
            long startTime = System.nanoTime();
            // BufferedReader 로 파일 읽기
            bufferedReader.readLine();
            while (bufferedReader.readLine() != null) ;
            long endTime = System.nanoTime();
            System.out.println("BufferedReader 소요 시간 : " + (endTime - startTime) + "ns");

            startTime = System.nanoTime();
            // Scanner 로 파일 읽기
            scanner.nextLine();
            while (scanner.hasNextLine()) scanner.nextLine();
            endTime = System.nanoTime();
            System.out.println("Scanner 소요 시간 : " + (endTime - startTime) + "ns");

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

이 코드는 BufferedReaderScanner가 동일한 파일에서 데이터를 읽는 데 걸리는 시간을 비교합니다. 시간은 다를 수 있지만, 출력 결과는 어느 쪽이 더 오래 걸렸는지 알려줍니다.

파일 한 줄씩 읽기 (Java, Python 예제)

BufferedReader 클래스는 데이터를 읽기 위한 여러 메서드를 제공합니다. readLine() 메서드는 한 번에 한 줄씩 읽습니다. 이 메서드는 스트림의 끝에 도달하면 null을 반환합니다. 이 단계에서는 BufferedReader.readLine()을 사용하여 파일을 읽습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }

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

파일에서 문자 하나씩 읽기 (Java, Python 방법)

BufferedReader 클래스의 read() 메서드를 사용하여 한 번에 하나의 문자를 읽을 수도 있습니다. 이 메서드는 읽은 문자를 정수로 반환합니다. 스트림의 끝에 도달하면 -1 을 반환합니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            int charRead;
            while ((charRead = bufferedReader.read()) != -1) {
                System.out.print((char) charRead);
            }

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

파일에서 여러 문자 읽기 (Java, Python 예제)

read() 메서드는 한 번에 여러 문자를 읽을 수 있습니다. 데이터를 저장할 char 배열을 전달해야 합니다. 또한 char 배열의 시작 인덱스를 나타내는 오프셋 (offset) 을 사용해야 합니다. 저장된 데이터는 이 인덱스부터 시작합니다. 읽을 최대 문자 길이도 지정해야 합니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            char[] charArr = new char[5];
            bufferedReader.read(charArr, 0, 5);
            System.out.print(charArr);

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

문자 건너뛰기 (파일 읽기, Java, Python)

BufferedReader 클래스는 문자를 건너뛰는 데 사용할 수 있는 skip() 메서드를 제공합니다. 이 메서드는 long 타입의 매개변수를 받습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            int charRead;
            StringBuilder sb = new StringBuilder();
            while ((charRead = bufferedReader.read()) != -1) {
                if (charRead != '*') {
                    sb.append((char) charRead);
                } else {
                    bufferedReader.skip(1);
                }
            }
            System.out.println(sb);

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

Mark 와 Reset (파일 읽기, Java, Python)

BufferedReader 클래스는 특정 문자를 표시하기 위한 mark() 메서드를 제공합니다. reset() 메서드를 사용하여 언제든지 이 표시된 문자로 돌아갈 수 있습니다. mark() 메서드는 mark 가 유효하지 않게 되기 전에 읽을 수 있는 최대 바이트 수를 나타내는 정수를 입력으로 받습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        String path = "path/to/your/file.txt";
        try (FileReader fileReader = new FileReader(path);
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            char[] charArr = new char[5];
            charArr[0] = (char) bufferedReader.read();
            charArr[1] = (char) bufferedReader.read();

            bufferedReader.mark(10);
            bufferedReader.skip(1);
            charArr[2] = (char) bufferedReader.read();
            charArr[3] = (char) bufferedReader.read();
            charArr[4] = (char) bufferedReader.read();
            System.out.println(charArr);

            bufferedReader.reset();
            char asterisk = (char) bufferedReader.read();
            System.out.print(asterisk);

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

요약

이 랩에서는 Java BufferedReader 클래스를 사용하여 문자 입력 스트림에서 텍스트를 읽었습니다. 성능과 효율성을 향상시키기 위해 다른 reader 클래스와 입력 스트림을 BufferedReader로 래핑하는 방법을 배웠습니다. 파일에서 단일 및 여러 문자를 읽는 방법, 문자를 건너뛰는 방법, 파일 내 위치를 표시하고 재설정하는 방법, BufferedReader 클래스와 Scanner 클래스를 비교하는 방법과 같은 주제를 다루었습니다. 또한 스트림을 자동으로 닫고 메모리 누수를 방지하기 위해 try-with-resources 블록을 사용했습니다.