Vì vậy, bạn biết bạn có thể sử dụng AsynchronousFileChannel để đọc toàn bộ tập tin vào một String:Làm thế nào để sử dụng AsynchronousFileChannel để đọc cho một StringBuffer hiệu quả
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(filePath, StandardOpenOption.READ);
long len = fileChannel.size();
ReadAttachment readAttachment = new ReadAttachment();
readAttachment.byteBuffer = ByteBuffer.allocate((int) len);
readAttachment.asynchronousChannel = fileChannel;
CompletionHandler<Integer, ReadAttachment> completionHandler = new CompletionHandler<Integer, ReadAttachment>() {
@Override
public void completed(Integer result, ReadAttachment attachment) {
String content = new String(attachment.byteBuffer.array());
try {
attachment.asynchronousChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
completeCallback.accept(content);
}
@Override
public void failed(Throwable exc, ReadAttachment attachment) {
exc.printStackTrace();
exceptionError(errorCallback, completeCallback, String.format("error while reading file [%s]: %s", path, exc.getMessage()));
}
};
fileChannel.read(
readAttachment.byteBuffer,
0,
readAttachment,
completionHandler);
Giả sử bây giờ, tôi không muốn phân bổ toàn bộ một ByteBuffer
, nhưng đọc từng dòng một. Tôi có thể sử dụng ByteBuffer
chiều rộng cố định và giữ lại read
nhiều lần, luôn sao chép và thêm vào StringBuffer cho đến khi tôi không nhận được dòng mới ... Mối quan tâm duy nhất của tôi là: vì mã hóa tệp mà tôi đang đọc có thể là đa byte cho mỗi ký tự (UTF cái gì đó), nó có thể xảy ra rằng byte đọc kết thúc với một ký tự chưa hoàn thành. Làm thế nào tôi có thể chắc chắn rằng tôi đang chuyển đổi các byte phải thành chuỗi và không rối tung lên các mã hóa?
CẬP NHẬT: câu trả lời nằm trong nhận xét của câu trả lời đã chọn, nhưng về cơ bản chỉ đến CharsetDecoder.
Không sử dụng async I/O để đọc dòng. Nó chỉ là không phù hợp. Bạn có thể đọc hàng triệu dòng trên giây với 'BufferedReader.readLine(). ' – EJP
Tôi cần hoạt động không chặn! – gotch4
Vậy tại sao bạn sử dụng I/O không đồng bộ? Đó không phải là không chặn. Đây là một mô hình thứ ba, sau khi chặn và không chặn. Nhưng tại sao bạn nghĩ rằng bạn không thể sử dụng chặn I/O ở nơi đầu tiên? – EJP