2012-10-01 37 views
7

thể trùng lặp:
Best Way to Write Bytes in the Middle of a File in JavaViết byte vào một tập tin mà không cần xóa byte hiện

Tôi có một tập tin trong đó tôi cần phải viết byte.

Tôi biết vị trí nào trong tệp tôi cần phải chèn các byte cụ thể. Để làm rõ mọi thứ, tôi cần viết các byte ở giữa tệp mà không xóa bất kỳ byte hiện có nào. Toàn bộ hoạt động sau đó sẽ tăng độ dài của tập tin.

Cách tốt nhất để làm như vậy là gì?

+0

http://stackoverflow.com/questions/181408/best-way-to-write-bytes-in-the-middle-of-a-file-in-java – gtgaxiola

+0

Đã thử, rất tiếc việc triển khai của tôi không thêm byte nhưng xóa byte hiện tại, mẹo thực sự chèn là gì? –

+0

@gtgaxiola: Điều đó sẽ không hoạt động vì nó sẽ ghi đè lên các byte hiện có –

Trả lời

4

Cách duy nhất để thực hiện việc này là chuyển các byte hiện đang hoạt động. Tùy thuộc vào mức độ thường xuyên bạn phải thực hiện việc này và tệp lớn như thế nào, thường là một ý tưởng hay hơn để tạo tệp mới, sao chép tệp hiện có và chèn các byte mới trên đường đi.

Nếu bạn cần cập nhật các tập tin thường xuyên, hoặc nó nhỏ (lên đến có lẽ 100 kb), bạn có thể sử dụng một RandomAccessFile:

  1. Mở rộng tập tin, sử dụng phương pháp setLength(), thêm số byte bạn sẽ được chèn vào bất kỳ thứ gì được trả về theo phương thức length().
  2. Nếu bạn có đủ bộ nhớ, hãy tạo byte[] sẽ giữ tất cả các byte từ điểm chèn đến đầu tệp trước đó.
  3. Gọi seek() vị trí tại điểm chèn
  4. Gọi readFully() để điền vào mảng tạm thời của bạn
  5. Gọi seek() vị trí tại điểm chèn + số byte để chèn
  6. Gọi write() viết đệm của bạn ở đó điểm
  7. Gọi seek() để định vị tại điểm chèn
  8. Gọi 'write() để viết các byte mới

Nếu bạn không thể tạo một mảng đủ lớn trong bướC# 2, bạn sẽ phải thực hiện các bước 3-6 trong vòng lặp với bộ đệm nhỏ hơn. Tôi sẽ sử dụng ít nhất một bộ đệm 64k cho hiệu quả.

+0

+1 được bảo vệ rất tốt. –

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