2010-07-21 20 views
5

Tôi có một tập hợp lớn các tệp, tất cả đều có (phải là) một ký tự gửi (1 byte) được thêm vào cuối tệp. Làm thế nào tôi có thể đọc các byte cuối cùng (để đảm bảo nó là nhân vật) và cắt nó thành kích thước (ví dụ: loại bỏ các ký tự)?Đọc byte cuối cùng từ tệp và cắt ngắn thành kích thước

Tôi biết tôi có thể đọc toàn bộ nội dung và viết lại tất cả trừ ký tự cuối cùng, nhưng phải có cách để truy cập vào một byte cụ thể, phải không?

+2

Có vẻ nguy hiểm đối với tôi. Điều gì sẽ xảy ra nếu một tệp thông thường có byte đặc biệt đó? – tafa

+0

@tafa Tôi đang làm việc trên một tập hợp các tệp cụ thể, tôi biết việc xóa nó là an toàn. – NullUserException

Trả lời

11

Bạn có thể sử dụng lớp RandomAccessFile để tìm phần cuối của tệp, đọc nó và sau đó cắt bớt tệp bằng cách sử dụng setLength().

Cập nhật: Dưới đây là một số mã:

File target = new File("/path/to/file"); 
RandomAccessFile file = new RandomAccessFile(target,"rwd"); 
file.seek(target.length()-1); // Set the pointer to the end of the file 
char c = file.readChar(); 
if(c == '|') // Change the pipe character to whatever your sentinel character is 
{ 
    file.setLength(target.length()-1); // Strip off the last _byte_, not the last character 
} 

Lưu ý: Tôi đã không kiểm tra mã này, không xử lý lỗi vv

Nếu tập tin là trong bất kỳ phi-8-bit bộ ký tự, target.length()-1 sẽ cần được điều chỉnh.

+0

+1 + kiểm tra mã viết, mặc dù tôi không cần nó. Nhưng RandomAccessFile chính xác là những gì tôi đang tìm kiếm. Và vâng, dường như mọi phương thức trong RandomAccessFile đều ném ra một IOException. – NullUserException

+0

'file.readChar()' không có ý nghĩa ở đây, ngoại trừ nếu dữ liệu được viết bằng cách sử dụng một 'DataOutput' hoặc một mã hóa tương thích (tôi nghĩ UTF-16LE). Trong mọi trường hợp, nó hoạt động với ký tự được chỉ định * (1 byte) *. Sử dụng 'readByte()' sẽ thích hợp. – maaartinus

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