Więc wiesz, że możesz używać AsynchronousFileChannel przeczytać cały plik do sznurka:Jak korzystać AsynchronousFileChannel czytać do StringBuffer skutecznie
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);
Załóżmy, że teraz, nie chcę przeznaczyć cały ByteBuffer
, ale czytuj linia po linii. Mógłbym użyć ByteBuffer
o stałej szerokości i ciągle przywoływać read
wiele razy, zawsze kopiując i dołączając do StringBuffer, dopóki nie dostanę nowej linii ... Moje jedyne zmartwienie to: ponieważ kodowanie pliku, który czytam może być wielobajtowy na znak (coś UTF), może się zdarzyć, że przeczytane bajty kończą się niekompletną postacią. Jak mogę się upewnić, że konwertuję właściwe bajty na ciągi i nie zepsuję kodowania?
AKTUALIZACJA: odpowiedź jest w komentarzu wybranej odpowiedzi, ale w zasadzie wskazuje na CharsetDecoder.
Nie stosować asynchroniczne I/O czytać wiersze. Po prostu nie nadaje się. Możesz przeczytać miliony linii na sekundę za pomocą 'BufferedReader.readLine().' – EJP
Potrzebuję operacji bez blokowania! – gotch4
Dlaczego więc używasz asynchronicznych I/O? To nie jest blokowanie. Jest to trzeci paradygmat, po blokowaniu i bez blokowania. Ale dlaczego myślisz, że nie możesz w pierwszej kolejności korzystać z blokujących wejść/wyjść? – EJP