我可以使用java.nio进行控制台输入吗?
考虑到竞争性编程的情况,我必须从控制台读取2*10^5(甚至更多)个数字。然后我使用我可以使用java.nio进行控制台输入吗?,java,performance,optimization,java-8,java-io,Java,Performance,Optimization,Java 8,Java Io,考虑到竞争性编程的情况,我必须从控制台读取2*10^5(甚至更多)个数字。然后我使用BufferedReader,或者为了更快的性能,我使用了在引擎盖下使用DataInputStream的定制读卡器类 快速互联网搜索给了我这个 对于较小的数据流,我们可以使用java.io,对于较大的数据流,我们可以使用java.nio 因此,我想尝试java.nio控制台输入,并根据java.io性能测试它 是否可以使用java.nio读取控制台输入 我可以使用java.nio从System.in读取数据吗 它
BufferedReader
,或者为了更快的性能,我使用了在引擎盖下使用DataInputStream
的定制读卡器类
快速互联网搜索给了我这个
对于较小的数据流,我们可以使用java.io
,对于较大的数据流,我们可以使用java.nio
因此,我想尝试java.nio
控制台输入,并根据java.io
性能测试它
java.nio
读取控制台输入李>
java.nio
从System.in
读取数据吗李>
谢谢✌️ 你可以打开一个频道,像stdin一样
FileInputStream stdin = new FileInputStream(FileDescriptor.in);
FileChannel stdinChannel = stdin.getChannel();
当stdin被重定向到一个文件时,诸如查询大小、执行到其他通道的快速传输甚至内存映射等操作都可以工作。但是,当输入是真正的控制台或管道,或者您正在读取字符数据时,性能不太可能有显著差异
性能取决于您阅读它的方式,而不是您使用的类
下面是一个直接在通道上操作以处理以空格分隔的十进制数的代码示例
CharsetDecoder cs = Charset.defaultCharset().newDecoder();
ByteBuffer bb = ByteBuffer.allocate(1024);
CharBuffer cb = CharBuffer.allocate(1024);
while(stdinChannel.read(bb) >= 0) {
bb.flip();
cs.decode(bb, cb, false);
bb.compact();
cb.flip();
extractDoubles(cb);
cb.compact();
}
bb.flip();
cs.decode(bb, cb, true);
if(cb.position() > 0) {
cb.flip();
extractDoubles(cb);
}
private static void提取器double(CharBuffer cb){
双精度:for(int p=cb.position();p
这比使用java.util.Scanner
或BufferedReader
的readLine()
后跟split(\\s”)
要复杂得多,但其优点是避免了正则表达式引擎的复杂性,并且不为行创建String
对象。当每行或空行有多个数字时,即行字符串与数字字符串不匹配,这可以节省字符串构造固有的复制开销
此代码仍在处理任意字符集。当您知道预期的字符集并且它是基于ASCII的时,使用轻量级转换而不是如中所示的
字符集解码器
,可以获得额外的性能提高。您可以打开一个类似stdin的通道
FileInputStream stdin = new FileInputStream(FileDescriptor.in);
FileChannel stdinChannel = stdin.getChannel();
当stdin被重定向到一个文件时,诸如查询大小、执行到其他通道的快速传输甚至内存映射等操作都可以工作。但是,当输入是真正的控制台或管道,或者您正在读取字符数据时,性能不太可能有显著差异
性能取决于您阅读它的方式,而不是您使用的类
下面是一个直接在通道上操作以处理以空格分隔的十进制数的代码示例
CharsetDecoder cs = Charset.defaultCharset().newDecoder();
ByteBuffer bb = ByteBuffer.allocate(1024);
CharBuffer cb = CharBuffer.allocate(1024);
while(stdinChannel.read(bb) >= 0) {
bb.flip();
cs.decode(bb, cb, false);
bb.compact();
cb.flip();
extractDoubles(cb);
cb.compact();
}
bb.flip();
cs.decode(bb, cb, true);
if(cb.position() > 0) {
cb.flip();
extractDoubles(cb);
}
private static void提取器double(CharBuffer cb){
双精度:for(int p=cb.position();p
这比使用java.util.Scanner
或BufferedReader
的readLine()
后跟split(\\s”)
要复杂得多,但其优点是避免了正则表达式引擎的复杂性,并且不为行创建String
对象。当每行或空行有多个数字时,即行字符串与数字字符串不匹配,这可以节省字符串构造固有的复制开销
此代码仍在处理任意字符集。当您知道预期的字符集并且它是基于ASCII的时,使用轻量级转换而不是如中所示的
字符集解码器
,可以获得额外的性能提高。通过“控制台”您的意思是,用户键入?在这种情况下,“fast”与什么相关?也就是说a)一般来说,BufferedReader
如果首先使用足够大的缓冲区进行读取,则不会加快任何速度。它可以加速那些错误地从文件中逐字符读取字符的应用程序,但对于用户真正逐字符键入字符的控制台,BufferedReader
会使情况变得更糟。b) 没有理由认为DataInputStream
应该比普通InputStream
快。c) 您可以为stdin创建一个频道
,但NIO不是灵丹妙药,期望有相同的性能。Console的意思类似于在竞争性编程中,我们从标准输入即系统中读取的内容。其中有大型输入测试用例,数字有哪些格式?十进制格式主要类似于数字,由“Console”用空格分隔你是说用户输入的东西?在这种情况下,“fast”与什么相关?也就是说a)一般来说,BufferedReader
如果首先使用足够大的缓冲区进行读取,则不会加快任何速度。它可以加速那些犯下逐字读取错误的应用程序