2016-08-04 91 views
6

Tôi phải đọc một tệp văn bản từ ứng dụng Java của mình.Đọc/ghi đồng thời tệp trong Java

Tệp chứa nhiều hàng và tệp này được cập nhật mỗi X phút từ một ứng dụng không xác định bên ngoài nối thêm các dòng mới vào tệp.

Tôi phải đọc tất cả các hàng từ tệp và sau đó tôi phải xóa tất cả các bản ghi mà tôi vừa đọc.

Có thể cho phép tôi đọc hàng tệp theo hàng, xóa từng hàng tôi đọc và đồng thời cho phép ứng dụng bên ngoài nối thêm các hàng khác vào tệp không?

Tệp này nằm trong thư mục được chia sẻ Samba vì vậy tôi đang sử dụng jCIFS để đọc/ghi tệp và lớp Java BufferedReader.

cảm ơn trước

+0

Thay đổi tệp được viết bởi ứng dụng không thuộc quyền kiểm soát của bạn là ý tưởng tồi. Tại sao bạn cần xóa?Có lẽ nó sẽ là đủ để duy trì một điểm đánh dấu của bao nhiêu dòng bạn đã đọc cho đến nay, mà không thay đổi tập tin? – RealSkeptic

+0

Đây là thứ mà các lệnh 'Socket Writing' và' RESTful POST' được tạo ra. –

+0

@RealSkeptic Tôi cần phải xóa hoặc cập nhật các dòng mà tôi vừa đọc vì tôi nghĩ đó là cách dễ nhất để đánh dấu các hàng là "đã được xử lý". Sau khi xử lý một hàng, tôi phải lưu trữ trong một bảng MySQL vì vậy tôi không cần phải để lại các hàng trong tệp nữa. –

Trả lời

1

Vấn đề là chúng tôi không biết cách ứng dụng bên ngoài ghi và/hoặc sử dụng lại tệp này. Nó có thể là một vấn đề nếu bạn xóa các hàng trong khi ứng dụng bên ngoài sử dụng bộ đếm để chạy chính xác ...

Không có giải pháp tốt trừ khi bạn biết cách ứng dụng khác hoạt động.

2

Tôi không biết giải pháp hoàn hảo cho vấn đề của bạn, nhưng tôi sẽ giải quyết nó một cách khác:

  • đổi tên tập tin (cung cấp cho nó một cái tên độc đáo với một timestamp)
  • công việc appender sau đó sẽ tự động tái tạo nó
  • xử lí file thời gian đóng dấu của bạn (không cần phải xóa chúng, giữ chúng trong nơi để bạn sau này có thể kiểm tra những gì đã xảy ra)
+0

"công việc của người phụ trách sau đó sẽ tự động tạo lại nó" -> Không chắc chắn, ví dụ nếu nó chỉ thực hiện khi khởi chạy. – N0un

+0

@ N0un không chắc chắn, đúng, nhưng đáng để bắn. –

+0

@SeanPatrickFloyd Trừ khi một khách hàng hy vọng ứng dụng của họ sẽ thực hiện điều này một cách rất cụ thể trong môi trường sản xuất. –

0

Có thể cho phép tôi đọc từng hàng tập tin, xóa từng hàng tôi đọc và đồng thời cho phép ứng dụng bên ngoài nối thêm các hàng khác vào tập tin không?

Có, bạn có thể mở cùng một tệp để đọc và viết từ nhiều quy trình. Trong Linux, ví dụ, bạn sẽ nhận được hai riêng biệt file descriptors cho cùng một tệp. Đối với các tập tin ghi theo kích thước của PIPE_BUF, or 4096 bytes in Linux, nó là an toàn để giả định các hoạt động là nguyên tử, có nghĩa là hạt nhân đang xử lý khóa và mở khóa để ngăn chặn điều kiện chủng tộc.

Giả sử quy trình A đang ghi vào tệp đã mở dưới dạng PHỤ LỤC, sau đó mỗi lần Quy trình A thông báo cho hạt nhân là write() trước tiên nó sẽ tìm kích thước của tệp (phần cuối của tệp). Điều đó có nghĩa là bạn có thể xóa dữ liệu một cách an toàn trong tệp từ Process B, miễn là nó được thực hiện giữa các hoạt động ghi của Process A. Và miễn là các hoạt động ghi từ Process A không vượt quá PIPE_BUF, Linux đảm bảo chúng sẽ là nguyên tử, tức là Quy trình A có thể hoạt động viết thư rác và xử lý B có thể liên tục xóa/ghi dữ liệu, và sẽ không có hành vi sôi nổi nào xảy ra.

Java cung cấp cho bạn implemented File Locks. Nhưng điều quan trọng là phải hiểu rằng đó chỉ là "tư vấn", không phải "bắt buộc". Java không thực thi các hạn chế, cả hai quá trình phải thực hiện một kiểm tra để xem nếu một quá trình giữ khóa.

+0

Khóa? Linux sẽ xử lý nó? Bạn có thể hiển thị tài liệu xác nhận xác nhận này không? – RealSkeptic

+0

@RealSkeptic Tôi không thể tìm thấy một bài đăng chính thức từ Linus Torvald. Nhưng nếu bạn google nó bạn sẽ tìm thấy một sự phong phú của bằng chứng trong sách, trang web, và các khóa học Hệ điều hành. [Đây là một ví dụ] (http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html). Ngoài ra, thêm [hỗ trợ stackoverflow] (http://stackoverflow.com/a/2751750/1241782). –

+0

* Đối với các tập tin ghi theo kích thước của PIPE_BUF, hoặc 4096 byte trong Linux, nó là an toàn để giả định các hoạt động là nguyên tử, có nghĩa là hạt nhân đang xử lý khóa và mở khóa để ngăn chặn điều kiện chủng tộc. một hệ thống tệp được chia sẻ dường như đang được cập nhật qua các kết nối mạng. Đọc từ một tập tin được viết đến là khó đủ để làm đáng tin cậy với mã C cấp thấp trên một tệp cục bộ - thực hiện nó trong Java qua mạng * và * sửa đổi tệp đồng thời với quá trình viết sẽ cực kỳ khó khăn nhất . –

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