2011-11-21 13 views
33

Phương pháp sau đây chỉ ghi ra mục mới nhất mà tôi đã thêm vào, nó không thêm vào các mục trước đó. Tôi đang làm gì sai?Phương thức chắp thêm PrintWriter không phụ thêm

public void addNew() { 
    try { 
     PrintWriter pw = new PrintWriter(new File("persons.txt")); 
     int id = Integer.parseInt(jTextField.getText()); 
     String name = jTextField1.getText(); 
     String surname = jTextField2.getText(); 
     Person p = new Person(id,name,surname); 
     pw.append(p.toString()); 
     pw.append("sdf"); 
     pw.close(); 
    } catch (FileNotFoundException e) {...} 
} 

Trả lời

64

Thực tế là phương pháp PrintWriter 's được gọi là append() không có nghĩa là nó thay đổi chế độ của tập tin được mở ra.

Bạn cần phải mở tập tin trong chế độ append cũng như:

PrintWriter pw = new PrintWriter(new FileOutputStream(
    new File("persons.txt"), 
    true /* append = true */)); 

Cũng lưu ý rằng tập tin này sẽ được viết bằng mã hóa mặc định của hệ thống. Nó không phải luôn luôn mong muốn và có thể gây ra các vấn đề về khả năng tương tác, bạn có thể muốn chỉ định mã hóa tệp một cách rõ ràng.

+0

này cũng giống như đánh thức thread ngủ, vì vậy xin lỗi vì điều đó. Nhưng tôi có một nghi ngờ. làm thế nào tôi sẽ làm phụ thêm hoạt động trong tập tin nếu tôi chỉ cho đối tượng File, và tôi không được phép sử dụng các lớp Stream (ví dụ FileOutputStream và vv). Những gì tôi được phép là: Printwriter pw = new PrintWriter (file); : Tôi đã thử nối thêm(), write(), print(). là có bất kỳ phương pháp readymade cho phụ thêm trong kịch bản này. –

+0

Để làm rõ, phương thức 'append()' của PrintWriter đề cập đến thực tế là nó phụ thêm vào Writer bằng chính i.e là dòng đầu ra của chính nó chứ không phải cho tệp. –

+0

Và với tham chiếu đến câu hỏi của @ user1707035, không, có vẻ như bạn không thể sử dụng PrintWriter để chắp thêm mà không cần xây dựng nó với đối tượng OutputStream. Điều này là do PrintWriter mở luồng tại thời điểm đó là instantiation và các constructor duy nhất hỗ trợ File hoặc filename như một đối số mở File bằng cách xây dựng một đối tượng OutputStream bên trong mà không có tham số 'append'. Tham chiếu (tài liệu): https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File) –

15
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true)); 

true là cờ nối thêm. Xem documentation.

9

mở tập tin trong chế độ append, như với đoạn mã sau:

PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
4

IMHO câu trả lời chấp nhận không xem xét thực tế là mục đích là để viết các ký tự. (Tôi biết chủ đề là cũ, nhưng kể từ khi tìm kiếm cùng một chủ đề tôi stumbled khi đăng bài này trước khi tìm giải pháp được tư vấn, tôi đang gửi bài ở đây.)

Từ FileOutputStream docs, bạn sử dụng FileOutputStream khi bạn muốn in byte .

FileOutputStream có nghĩa là để ghi luồng byte thô như dữ liệu hình ảnh. Để viết luồng ký tự, hãy xem xét sử dụng FileWriter.

Bên cạnh đó, từ BufferedWriter docs:

Trừ khi đầu ra dấu nhắc là cần thiết, nó là khuyến khích để bọc một BufferedWriter xung quanh bất kỳ Writer mà write() hoạt động có thể tốn kém, chẳng hạn như FileWriters và OutputStreamWriters .

Cuối cùng, câu trả lời sẽ là như sau (như đã đề cập in this other StackOverFlow post):

PrintWriter out = null; 
try { 
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true))); 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
}finally{ 
    if(out != null){ 
     out.close(); 
    } 
} 

Ngoài ra, như của Java 7, bạn có thể sử dụng một câu lệnh try-với-tài nguyên. Không khối finally được yêu cầu đóng tài nguyên khai báo (s) vì nó được xử lý tự động, và cũng ít verbose:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) { 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
}