ลบบรรทัดที่ตรงกับ Pattern จากไฟล์
ใช้ไฟล์ชั่วคราว (temp file) อ่านไฟล์ต้นฉบับ เขียนเฉพาะบรรทัดที่ไม่ตรง pattern ลง temp แล้ว rename แทนที่
ตัวอย่างโค้ด (NIO.2 + Try-with-resources)
import java.io.*;
import java.nio.file.*;
public class Demo {
public static void deleteLines(Path inputFile, String lineToRemove) throws IOException {
Path tempFile = Files.createTempFile(inputFile.getParent(), "temp-", ".txt");
try (BufferedReader reader = Files.newBufferedReader(inputFile);
BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
String line;
while ((line = reader.readLine()) != null) {
if (!line.trim().equals(lineToRemove)) {
writer.write(line);
writer.newLine();
}
}
}
// Atomic replace
Files.move(tempFile, inputFile, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Deleted lines matching: " + lineToRemove);
}
public static void main(String[] args) {
try {
Path file = Paths.get("data.txt");
// สร้างไฟล์ทดสอบ
Files.write(file, List.of("line 1", "DELETE ME", "line 3", "DELETE ME", "line 5"));
deleteLines(file, "DELETE ME");
// Verify
System.out.println("Remaining: " + Files.readAllLines(file));
} catch (IOException e) {
e.printStackTrace();
}
}
}
จุดสำคัญ
- Atomic replace:
Files.move(..., REPLACE_EXISTING)- ป้องกันไฟล์เสียหายถ้า crash ระหว่างทำงาน - Temp file ใน directory เดียวกัน: ให้ rename ทำงานได้ (cross-device move ล้มเหลว)
- Trim vs Exact match: โค้ดใช้
trim().equals()ลบบรรทัดที่มีแค่ target (ignore leading/trailing spaces) - Encoding: ใช้ UTF-8 default (ระบุได้ใน newBufferedReader/Writer)
ขยาย: ลบด้วย Regex
Pattern pattern = Pattern.compile("^DELETE.*"); // บรรทัดขึ้นต้นด้วย DELETE
if (!pattern.matcher(line).matches()) {
writer.write(line);
writer.newLine();
}
Legacy java.io Version
// ใช้ File, FileReader, FileWriter, BufferedReader, BufferedWriter
// ต้อง renameTo() manual (ไม่ atomic บนบาง OS)
File temp = File.createTempFile("temp", ".txt", inputFile.getParentFile());
// ... write ...
temp.renameTo(inputFile); // อาจ fail บน Windows ถ้า inputFile ยังเปิดอยู่