소개
이 랩에서는 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를 생성할 수도 있습니다. 이 단계에서는 InputStreamReader를 BufferedReader로 래핑하고 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 와 관련된 모든 시스템 리소스를 해제하기 위해 항상 BufferedReader의 close() 메서드를 사용해야 합니다. 코드를 단순화하기 위해 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 비교
Scanner와 BufferedReader는 모두 외부 소스에서 데이터를 읽는 데 사용할 수 있습니다. 그러나 이 두 클래스 간에는 몇 가지 차이점이 있습니다. 이 단계에서는 몇 가지 주요 차이점을 비교해 보겠습니다.
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();
}
}
}
이 코드는 BufferedReader와 Scanner가 동일한 파일에서 데이터를 읽는 데 걸리는 시간을 비교합니다. 시간은 다를 수 있지만, 출력 결과는 어느 쪽이 더 오래 걸렸는지 알려줍니다.
파일 한 줄씩 읽기 (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 블록을 사용했습니다.



