Vous savez que vous pouvez utiliser AsynchronousFileChannel pour lire un fichier entier à une chaîne:Comment utiliser AsynchronousFileChannel pour lire à un StringBuffer efficace
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);
Supposons que maintenant, je ne veux pas affecter un ensemble ByteBuffer
, mais lisez ligne par ligne. Je pourrais utiliser un ByteBuffer
de largeur fixe et continuer à rappeler read
plusieurs fois, en copiant et en ajoutant toujours à un StringBuffer jusqu'à ce que je n'obtienne pas à une nouvelle ligne ... Ma seule préoccupation est: parce que l'encodage du dossier que je lis peut être multi octet par caractère (quelque chose UTF), il peut arriver que les octets lus se terminent par un caractère incomplet. Comment puis-je m'assurer que je convertis les bons octets en chaînes et que je ne gâche pas l'encodage?
MISE À JOUR: réponse est dans le commentaire de la réponse sélectionnée, mais il pointe essentiellement à CharsetDecoder.
Ne pas utiliser async E/S pour lire les lignes. Ce n'est tout simplement pas approprié. Vous pouvez lire des millions de lignes par seconde avec 'BufferedReader.readLine().' – EJP
J'ai besoin d'une opération non bloquante! – gotch4
Alors pourquoi utilisez-vous des E/S asynchrones? Ce n'est pas non-bloquant. C'est un troisième paradigme, après blocage et non-blocage. Mais pourquoi pensez-vous que vous ne pouvez pas utiliser les E/S bloquantes en premier lieu? – EJP