Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java ลบข้อความเฉพาะจากไฟล์

ลบบรรทัดที่ตรงกับ 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 ยังเปิดอยู่