2012-12-06 33 views
5

Tôi muốn xóa một số nội dung của tệp bằng chương trình java như dưới đây. Đây có phải là phương thức ghi để thay thế trong cùng một tệp hoặc nó phải được sao chép sang tệp khác.Sửa đổi nội dung của tệp bằng cách sử dụng Java

Nhưng việc xóa tất cả nội dung của tệp.

class FileReplace 
{ 
    ArrayList<String> lines = new ArrayList<String>(); 
    String line = null; 
    public void doIt() 
    { 
     try 
     { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while (line = br.readLine() != null) 
      { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      out.write(lines.toString()); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    public statc void main(String args[]) 
    { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+0

tôi nghĩ bạn nên sử dụng tên br chỉ một lần;) – acostache

+0

1) đóng trình đọc sau khi sử dụng: 'br.close()'; 2) 'out' trong mã của bạn là gì? 3) kết quả là gì, bạn mong đợi điều gì? – Andy

Trả lời

11

tôi sẽ bắt đầu với đóng cửa đọc, và xả nước nhà văn:

public class FileReplace { 
    List<String> lines = new ArrayList<String>(); 
    String line = null; 

    public void doIt() { 
     try { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while ((line = br.readLine()) != null) { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      fr.close(); 
      br.close(); 

      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      for(String s : lines) 
       out.write(s); 
      out.flush(); 
      out.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+1

-1 Tôi không thể tìm thấy bất kỳ 'writeline' trong' BufferWriter' cũng 'Close' nên viết hoa. –

2

Hãy chắc chắn để:

  • close bất kỳ dòng khi bạn không còn cần đến chúng
  • Đặc biệt trước mở lại nó để viết.
  • truncate tệp, để đảm bảo tệp co lại nếu bạn viết ít hơn.
  • sau đó viết đầu ra
  • viết các dòng riêng lẻ, không dựa trên toString.
  • flushclose khi bạn viết xong!

Nếu bạn sử dụng đệm IO, bạn luôn phải đảm bảo rằng bộ đệm bị xóa ở cuối hoặc bạn có thể mất dữ liệu!

+0

trợ giúp với mã –

+0

Tôi không chắc chắn rằng anh ấy đang đọc/viết cùng một lúc. Ông đọc các dòng vào một danh sách, sau đó viết danh sách vào tập tin, hoặc ít nhất là cố gắng. – Qwerky

3

Đọc + ghi vào cùng một tệp simulatenously không ổn.

CHỈNH SỬA: để thuật lại và chính xác hơn và cụ thể - đọc và ghi vào cùng một tệp, trong cùng một chuỗi, mà không đóng đúng trình đọc (và bỏ qua tác giả) thì không được.

+1

Bạn có thể giải thích lý do tại sao? –

+1

Có, nói chung, một lý do là vì các khoảng bù trong tệp sẽ thay đổi mỗi khi bạn viết và con trỏ đọc sẽ không theo dõi được điều đó (xem câu trả lời được chấp nhận tại đây: http://stackoverflow.com/questions/ 4251058/java-đọc-và-ghi-một-tập-cùng). Tuy nhiên, sau khi đọc lại câu hỏi này, vấn đề ở đây không phải là (tôi đã trả lời quá nhanh), nhưng một vấn đề không phải là kết thúc và không sử dụng. – acostache

0

Tôi có thể thấy ba vấn đề.

Trước tiên, bạn đang viết thư tới out mà tôi cho là System.out, không phải luồng đầu ra cho tệp.

Thứ hai, nếu bạn ghi vào luồng đầu ra vào tệp, bạn cần đóng nó.

Thứ ba, phương thức toString() trên ArrayList sẽ không ghi tệp như bạn mong đợi. Lặp lại danh sách và viết mỗi lần String. Hãy tự hỏi liệu bạn có cần viết các ký tự dòng mới hay không.

7

Câu trả lời được chấp nhận là rất tốt. Tuy nhiên, có một cách dễ dàng hơn để thay thế nội dung trong một file sử dụng commons-io thư viện Apache (commons-io-2.4.jar - bạn có thể sử dụng bất kỳ phiên bản mới nhất)

private void update() throws IOException{ 
     File file = new File("myPath/myFile.txt"); 
     String fileContext = FileUtils.readFileToString(file); 
     fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED"); 
     FileUtils.write(file, fileContext); 
} 

Lưu ý: Ném IOException cần phải được bắt và xử lý bởi các ứng dụng phù hợp .

0

Câu trả lời được chấp nhận hơi sai. Đây là mã đúng.

public class FileReplace { 
List<String> lines = new ArrayList<String>(); 
String line = null; 

public void doIt() { 
    try { 
     File f1 = new File("d:/new folder/t1.htm"); 
     FileReader fr = new FileReader(f1); 
     BufferedReader br = new BufferedReader(fr); 
     while ((line = br.readLine()) != null) { 
      if (line.contains("java")) 
       line = line.replace("java", " "); 
      lines.add(line); 
     } 
     fr.close(); 
     br.close(); 

     FileWriter fw = new FileWriter(f1); 
     BufferedWriter out = new BufferedWriter(fw); 
     for(String s : lines) 
      out.write(s); 
     out.flush(); 
       } 
     out.close(); 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
+0

Bạn có thể nói tại sao câu trả lời được chấp nhận sai? –

+1

Có. "out.close()" phải nằm ngoài vòng lặp "for". –

+0

Nó nằm ngoài vòng lặp for. Vòng lặp 'for' chỉ là dòng tiếp theo, vì các niềng răng đã được phát ra. Bạn đã đặt nó bên ngoài khối 'try'. Một giải pháp tốt hơn là đặt các độc giả vào trong các khối 'using {...}' –

Các vấn đề liên quan