2008-10-14 44 views
8

Tôi có tệp văn bản mà tôi muốn chỉ thay đổi dòng đầu tiên của tệp. Các tập tin có thể là hàng triệu hàng dài, vì vậy tôi không muốn phải lặp lại tất cả mọi thứ, vì vậy tôi tự hỏi nếu có một cách khác để làm điều này.Thay dòng đầu tiên của tệp văn bản trong Java

Tôi cũng muốn áp dụng một số quy tắc cho dòng đầu tiên để tôi thay thế các trường hợp một số từ nhất định bằng các từ khác.

Điều này có khả thi không?

Trả lời

15

A RandomAccessFile sẽ thực hiện thủ thuật, trừ khi độ dài của đường kết quả khác với độ dài của dòng gốc.

Nếu hóa ra bạn buộc phải thực hiện một bản sao (nơi dòng đầu tiên được thay thế và phần còn lại của dữ liệu sẽ được sao chép), tôi khuyên bạn nên sử dụng BufferedReaderBufferedWriter. Lần đầu tiên sử dụng BufferedReader 's readLine() để đọc dòng đầu tiên. Sửa đổi nó và viết nó vào BufferedWriter. Sau đó, sử dụng mảng char[] để thực hiện bản sao brute-force của phần còn lại của tệp. Điều này sẽ hiệu quả hơn làm dòng sao chép theo dòng. Hãy cho tôi biết nếu bạn cần chi tiết ..

Tùy chọn khác là thực hiện việc đọc và ghi bên trong cùng một tệp. Nó sẽ phức tạp hơn một chút. :) Hãy cho tôi biết nếu bạn cần chi tiết về vấn đề này ..

+0

Bạn có thể cung cấp một số thông tin nếu độ dài của chuỗi được thay thế khác nhau không. Có thể không sao chép vào một tệp mới – png

+0

Nếu độ dài khác nhau, ít nhất bạn cũng phải ghi lại tất cả byte, trong cùng một tệp hoặc trong một tệp khác. – volley

+0

Bất cứ ai cũng có một ví dụ về cách làm điều này với RandomAccessFile? – jymbo

2

Bạn muốn có một RandomAccesssFile. Sử dụng tập tin bạn có thể đọc và viết bất cứ nơi nào bạn muốn trong tập tin.

Nó giống như một InputStream và OutputStream, nhưng nó cho phép đọc và viết bất cứ nơi nào bạn muốn.

1

chỉ áp dụng regex một lần. String.replaceFirst ("regex", "replacementstring"): http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replaceFirst(java.lang.String,%20java.lang.String)

Mở tệp dưới dạng RandomAccessFile. Đọc dòng đầu tiên vào một chuỗi và sau đó áp dụng thay đổi và sau đó viết chuỗi trở lại.

+0

chỉ khi độ dài của dòng 1 không thay đổi – Cheekysoft

+0

"Tệp có thể dài hàng triệu hàng" - chúc may mắn với regexp! LOL –

3

Nếu dòng mới có số lượng ký tự (byte) khác với dòng đầu tiên ban đầu, bạn sẽ phải ghi lại toàn bộ tệp để loại bỏ khoảng trống hoặc tránh ghi đè lên một phần của dòng thứ hai.

Tất nhiên, các công cụ khác nhau như String.replaceFirst(String regex, String replacement) (javadoc) hoặc RandomAccessFile (javadoc) có thể giúp bạn thực hiện tác vụ này.

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