Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用AsynchronousFileChannel高效地读取StringBuffer_Java_Nio_Utf - Fatal编程技术网

Java 如何使用AsynchronousFileChannel高效地读取StringBuffer

Java 如何使用AsynchronousFileChannel高效地读取StringBuffer,java,nio,utf,Java,Nio,Utf,因此,您知道可以使用AsynchronousFileChannel将整个文件读取为字符串: AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(filePath, StandardOpenOption.READ); long len = fileChannel.size(); ReadAttachment readAttachment = new ReadAtta

因此,您知道可以使用AsynchronousFileChannel将整个文件读取为字符串:

 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);
AsynchronousFileChannel fileChannel=AsynchronousFileChannel.open(文件路径,StandardOpenOption.READ);
long len=fileChannel.size();
ReadAttachment ReadAttachment=新的ReadAttachment();
readAttachment.byteBuffer=byteBuffer.allocate((int)len);
readAttachment.asynchronousChannel=fileChannel;
CompletionHandler CompletionHandler=新的CompletionHandler(){
@凌驾
公共作废已完成(整数结果,ReadAttachment附件){
字符串内容=新字符串(attachment.byteBuffer.array());
试一试{
attachment.asynchronousChannel.close();
}捕获(IOE异常){
e、 printStackTrace();
}
completeCallback.accept(内容);
}
@凌驾
public void失败(可丢弃的exc、ReadAttachment附件){
exc.printStackTrace();
exceptionError(errorCallback,completeCallback,String.format(“读取文件[%s]:%s]时出错,路径,exc.getMessage());
}
};
fileChannel.read(
readAttachment.byteBuffer,
0,
阅读附件,
完成处理程序);
假设现在,我不想分配整个
ByteBuffer
,而是逐行读取。我可以使用一个固定宽度的
ByteBuffer
,不断回忆
read
,总是复制并附加到StringBuffer,直到我找不到新行为止。。。我唯一担心的是:因为我正在读取的文件的编码可能是每个字符多字节(UTF之类的),所以读取的字节可能以不完整字符结尾。如何确保将正确的字节转换为字符串,并且不会弄乱编码


更新:答案在所选答案的注释中,但它基本上指向。

如果您的大小写(\n)中有清晰的ASCII分隔符,则不需要关心不完整的字符串,因为此字符映射到单字节(反之亦然)

所以只需在输入中搜索“\n”字节,然后读取并将之前的任何内容转换为字符串。循环,直到找不到更多新行。然后压缩缓冲区并将其重新用于下一次读取。如果找不到新行,则必须分配更大的缓冲区,复制旧行的内容,然后再次调用read

编辑:如评论中所述,您可以动态地将ByteBuffer传递给,并将其转换为CharBuffer(然后附加到StringBuilder或任何首选解决方案)。

尝试扫描仪:

    Scanner sc = new Scanner(FileChannel.open(filePath, StandardOpenOption.READ));
   String line = sc.readLine();

FileChannel是可中断的Channel

不要使用异步I/O来读取行。这是不合适的。使用
BufferedReader.readLine(),每秒可以读取数百万行。
我需要非阻塞操作!那么为什么要使用异步I/O呢?这不是非阻塞。这是继阻塞和非阻塞之后的第三种范式。但是为什么您认为首先不能使用阻塞I/O?如果我使用处理程序,它应该是非阻塞的否?你还建议什么样的模式呢?用这种方式,我必须将整行存储为字节缓冲区。。。让我们暂时忘记我在处理台词。。。我的缓冲区是有限的(行可以很长)。我们该怎么做?您可以使用来动态转换输入。您仍然需要管理缓冲区,因为它可能包含读取之间的剩余字符。太好了!谢谢,请考虑更新答案,我不需要中断,我需要开始阅读和回调稍后…