2013-01-23 32 views
7

Tôi đang đọc một dòng tập tin, và tôi đang cố gắng để làm cho nó để nếu tôi nhận được một dòng phù hợp với các thông số cụ thể của tôi (trong trường hợp của tôi nếu nó bắt đầu với một từ nào đó), rằng tôi có thể ghi đè lên dòng đó.Đọc và Ghi vào một tập tin cùng một lúc trong java

mã hiện tại của tôi:

try { 
    FileInputStream fis = new FileInputStream(myFile); 
    DataInputStream in = new DataInputStream(fis); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    String line; 

    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
      if (line.startsWith("word")) { 
       // replace line code here 
      } 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

... nơi myFile là một đối tượng File.

Như mọi khi, mọi trợ giúp, ví dụ hoặc đề xuất đều được đánh giá cao.

Cảm ơn!

+1

Tại sao không đọc toàn bộ tệp trong cùng một lúc, hãy đóng tệp, mở tệp để viết và sau đó viết ra mọi dòng sau khi thực hiện chuyển đổi trên đó? – Patashu

+1

@Patashu Nếu đó là một tệp lớn thì phương pháp được đề xuất của tôi sẽ hoạt động tốt hơn nhiều. – iphonedev7

+0

Vui lòng không sử dụng DataInputStream để đọc văn bản http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

Trả lời

4

Đặt cược tốt nhất của bạn ở đây có khả năng sẽ được đọc trong tệp vào bộ nhớ (Một cái gì đó giống như một StringBuilder) và viết những gì bạn muốn tệp đầu ra của bạn trông giống như trong StringBuilder. Sau khi đọc xong tệp, bạn sẽ muốn ghi nội dung của tệp StringBuilder vào tệp.

Nếu tệp quá lớn để thực hiện việc này trong bộ nhớ, bạn luôn có thể đọc nội dung của từng dòng tệp và ghi chúng vào tệp tạm thời thay vì StringBuilder. Sau khi hoàn tất, bạn có thể xóa tệp cũ và di chuyển tệp tạm thời vào vị trí của tệp.

+0

Ý tưởng hay ... Tôi sẽ cố gắng ngoài. – iphonedev7

12

RandomAccessFile có vẻ phù hợp. Javadoc của nó nói:

Các trường hợp của lớp này hỗ trợ cả đọc và ghi vào tệp truy cập ngẫu nhiên. Một tệp truy cập ngẫu nhiên hoạt động giống như một mảng lớn các byte được lưu trữ trong hệ thống tệp. Có một loại con trỏ, hoặc chỉ mục vào mảng ngụ ý, được gọi là con trỏ tập tin; hoạt động đầu vào đọc byte bắt đầu từ con trỏ tập tin và tiến lên con trỏ tập tin qua byte đọc. Nếu tệp truy cập ngẫu nhiên được tạo ở chế độ đọc/ghi, thì các hoạt động đầu ra cũng có sẵn; hoạt động đầu ra ghi byte bắt đầu từ con trỏ tập tin và chuyển con trỏ tập tin qua các byte được ghi. Các hoạt động đầu ra ghi qua đầu hiện tại của mảng được ngầm định làm cho mảng được mở rộng. Con trỏ tập tin có thể được đọc bằng phương thức getFilePointer và được thiết lập bằng phương thức tìm kiếm.

Điều đó nói rằng, vì tệp văn bản là định dạng tệp tuần tự, bạn không thể thay thế dòng bằng một dòng có độ dài khác nhau mà không di chuyển tất cả các ký tự tiếp theo. toàn bộ tệp. Điều này có thể dễ thực hiện hơn nếu bạn ghi vào một tệp riêng biệt và đổi tên tệp đầu ra khi bạn đã hoàn tất. Điều này cũng mạnh mẽ hơn trong trường hợp nếu xảy ra sự cố, bạn có thể thử lại với nội dung của tệp ban đầu. Ưu điểm duy nhất của RandomAccessFile là bạn không cần dung lượng đĩa cho tệp đầu ra tạm thời và có thể có hiệu suất tốt hơn một chút so với đĩa do vị trí truy cập tốt hơn.

+0

@MelNicholson Điều cần biết. Cảm ơn. – iphonedev7

+0

Đây phải là câu trả lời được chấp nhận. – Makaveli84

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