2011-12-19 33 views
17

Tôi muốn thay thế nội dung tệp dòng thứ hai, ai đó có thể giúp vui lòng dựa trên định dạng tệp và phương thức nghe bên dưới.Sửa đổi nội dung tệp hiện có trong Java

1324254875443 
1313131 
Paid 
0.0 

Dòng thứ hai dài và muốn thay thế cho currentTimeMillis().

/************** Pay Button Listener **************/ 
public class payListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 

     ArrayList<String> lines = new ArrayList<String>(); 
     String line = null; 

     try { 
      FileReader fr = new FileReader("Ticket/" + ticketIDNumber + ".dat"); 
      BufferedReader br = new BufferedReader(fr); 
      FileWriter fw = new FileWriter("Ticket/" + ticketIDNumber + ".dat"); 
      BufferedWriter bw = new BufferedWriter(fw); 
      while ((line = br.readLine()) != null) { 
       if (line.contains("1313131")) 
        line.replace(System.currentTimeMillis(); 
       lines.add(line); 
       bw.write(line); 
      } //end if     

     }  //end try 
     catch (Exception e) { 

     } //end catch 
    } //end while 
}//end method 

Trả lời

27

Như được đề xuất trong the accepted answer để a similar question:

mở một tập tin tạm thời trong chế độ văn bản cùng một lúc, và cho mỗi dòng, đọc nó, sửa đổi nếu cần thiết, sau đó viết vào tập tin tạm thời. Cuối cùng, xóa bản gốc và đổi tên tệp tạm thời.

Dựa trên thực hiện của bạn, một cái gì đó tương tự như:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class ReplaceFileContents { 
    public static void main(String[] args) { 
    new ReplaceFileContents().replace(); 
    } 

    public void replace() { 
     String oldFileName = "try.dat"; 
     String tmpFileName = "tmp_try.dat"; 

     BufferedReader br = null; 
     BufferedWriter bw = null; 
     try { 
     br = new BufferedReader(new FileReader(oldFileName)); 
     bw = new BufferedWriter(new FileWriter(tmpFileName)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("1313131")) 
       line = line.replace("1313131", ""+System.currentTimeMillis()); 
      bw.write(line+"\n"); 
     } 
     } catch (Exception e) { 
     return; 
     } finally { 
     try { 
      if(br != null) 
       br.close(); 
     } catch (IOException e) { 
      // 
     } 
     try { 
      if(bw != null) 
       bw.close(); 
     } catch (IOException e) { 
      // 
     } 
     } 
     // Once everything is complete, delete old file.. 
     File oldFile = new File(oldFileName); 
     oldFile.delete(); 

     // And rename tmp file's name to old file name 
     File newFile = new File(tmpFileName); 
     newFile.renameTo(oldFile); 

    } 
} 
+0

không có ý tưởng làm thế nào điều này làm việc cho bạn ?! vì đối với tôi nó thậm chí không tạo ra một tập tin. Để khắc phục, tôi tạo một phân tích cú pháp FileWriter mới trong một cá thể Tệp thay vì một chuỗi tên tệp như mã này. Vì vậy, rõ ràng là di chuyển 'File newFile = new File (tmpFileName)' trước khi tạo FileWriter và sử dụng cá thể File đó cho FileWriter. cố định nó cho tôi. – buymypies

3

Tôi có thể đề xuất sử dụng thư viện Apache Commons IO. Ở đó bạn sẽ tìm thấy lớp học org.apache.commons.io.FileUtils. Bạn có thể sử dụng nó:

File file = new File("... your file..."); 
List<String> lines = FileUtils.readLines(file); 
lines.set(1, ""+System.currentTimeMillis()); 
FileUtils.writeLines(file, lines); 

Mã này đọc toàn bộ nội dung tập tin vào một List of String s và thay đổi nội dung dòng thứ hai, sau đó viết danh sách trở lại tập tin.

+0

thư viện nào ở trong, nó không hoạt động, Danh sách cũng không được nhận dạng. – user1106130

1

Tôi không chắc chắn đọc và viết cùng một tệp cùng một lúc là một ý tưởng hay. Tôi nghĩ sẽ tốt hơn nếu đọc dòng tệp theo dòng vào một mảng String, thay thế dòng thứ hai và sau đó viết mảng String trở lại vào tệp.

+0

im chắc chắn nó có thể được thực hiện như trên, tôi nhận được lỗi sau đây? bất kỳ ý tưởng? – user1106130

19

Mặc dù câu hỏi này là rất cũ tôi muốn thêm rằng điều này có thể đạt được dễ dàng hơn nhiều kể từ Java 1.7 với java.nio.file.Files:

List<String> newLines = new ArrayList<>(); 
for (String line : Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8)) { 
    if (line.contains("1313131")) { 
     newLines.add(line.replace("1313131", ""+System.currentTimeMillis())); 
    } else { 
     newLines.add(line); 
    } 
} 
Files.write(Paths.get(fileName), newLines, StandardCharsets.UTF_8); 
+0

Cảm ơn lời khuyên này. Đó là năm 2017 và tôi vẫn dựa vào commons io –

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