사용되는 주요 API
String 클래스의 replaceAll() 메서드는 정규 표현식과 대체 문자열 두 개를 인수로 받아, 일치하는 부분을 지정한 문자열로 교체합니다.
java.util.Scanner 클래스는 생성자에 File, InputStream, Path, String 객체를 전달할 수 있으며, 정규 표현식을 기반으로 소스에서 기본형 데이터와 문자열을 토큰 단위로 읽어 들입니다. nextXXX() 계열 메서드를 사용하면 다양한 데이터 타입을 손쉽게 읽을 수 있습니다.
StringBuffer 클래스는 불변(immutable)인 String과 달리 가변(mutable) 문자열을 다룰 수 있는 대안으로, 객체를 생성한 후 append() 메서드로 데이터를 계속 추가할 수 있습니다.
처리 절차
파일의 특정 줄을 덮어쓰려면 아래 세 단계를 순서대로 진행합니다.
1단계: 파일 내용을 문자열로 읽어 오기
- File 클래스를 인스턴스화합니다.
- 파일 객체를 생성자 매개변수로 전달하여 Scanner 클래스를 인스턴스화합니다.
- 빈 StringBuffer 객체를 생성합니다.
- append() 메서드를 사용해 파일의 내용을 한 줄씩 StringBuffer에 추가합니다.
- toString() 메서드로 StringBuffer를 String으로 변환합니다.
- close() 메서드로 Scanner 객체를 닫습니다.
2단계: replaceAll()로 해당 줄 교체하기
읽어 온 문자열에 대해 replaceAll() 메서드를 호출하고, 교체 대상인 기존 줄(old line)과 새로 넣을 줄(new line)을 매개변수로 전달합니다.
3단계: 변경된 내용을 파일에 다시 쓰기
- FileWriter 클래스를 인스턴스화합니다.
- append() 메서드로 replaceAll()의 결과를 FileWriter 객체에 추가합니다.
- flush() 메서드를 호출해 버퍼의 데이터를 실제 파일에 반영합니다.
예제 코드
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class OverwriteLine {
public static void main(String args[]) throws IOException {
// File 클래스 인스턴스화
String filePath = "D://input.txt";
// 파일을 읽기 위해 Scanner 클래스 인스턴스화
Scanner sc = new Scanner(new File(filePath));
// StringBuffer 클래스 인스턴스화
StringBuffer buffer = new StringBuffer();
// 파일의 각 줄을 읽어 StringBuffer에 추가
while (sc.hasNextLine()) {
buffer.append(sc.nextLine() + System.lineSeparator());
}
String fileContents = buffer.toString();
System.out.println("파일 내용: " + fileContents);
// Scanner 객체 닫기
sc.close();
String oldLine = "어떠한 사전 조건도 장애물도 없습니다. Simply Easy Learning!";
String newLine = "무료 콘텐츠를 마음껏 즐겨보세요";
// 기존 줄을 새 줄로 교체
fileContents = fileContents.replaceAll(oldLine, newLine);
// FileWriter 클래스 인스턴스화
FileWriter writer = new FileWriter(filePath);
System.out.println("");
System.out.println("새 데이터: " + fileContents);
writer.append(fileContents);
writer.flush();
}
}실행 결과
파일 내용: 튜토리얼 포인트는 온라인 콘텐츠에 더 잘 반응하고 새로운 기술을 배우는 것을 선호하는 독자층이 있다는 아이디어에서 출발했습니다. 저희의 콘텐츠와 자료는 무료로 공개되어 있으며, 독자들이 원하는 만큼 다양한 기술을 습득할 수 있도록 이 방식을 유지하고자 합니다. 또한 독자들에게 회원가입이나 개인 정보 제출을 강요하지 않습니다. 어떠한 사전 조건도 장애물도 없습니다. Simply Easy Learning! 새 데이터: 튜토리얼 포인트는 온라인 콘텐츠에 더 잘 반응하고 새로운 기술을 배우는 것을 선호하는 독자층이 있다는 아이디어에서 출발했습니다. 저희의 콘텐츠와 자료는 무료로 공개되어 있으며, 독자들이 원하는 만큼 다양한 기술을 습득할 수 있도록 이 방식을 유지하고자 합니다. 또한 독자들에게 회원가입이나 개인 정보 제출을 강요하지 않습니다. 무료 콘텐츠를 마음껏 즐겨보세요
추가 팁
Java 7 이상에서는 try-with-resources 구문을 활용하면 Scanner와 FileWriter 같은 자원을 자동으로 닫을 수 있어 리소스 누수를 예방할 수 있습니다. 또한 여러 스레드가 동시에 접근하지 않는 환경이라면 StringBuffer 대신 동기화 오버헤드가 없는 StringBuilder를 사용하는 것이 성능 면에서 더 유리합니다.