我可以使用java.nio进行控制台输入吗?

Aashish Pawar:

考虑竞争性编程的情况,我必须从控制台读取2 * 10 ^ 5(甚至更多)数字。然后,我使用BufferedReader甚至为了提高性能而使用了DataInputStream在后台使用的自定义阅读器类

快速的互联网搜索给了我这个。

我们可以使用java.io较小的数据流,也可以使用较大的流java.nio

所以我想尝试java.nio控制台输入并针对java.io性能进行测试

  1. 是否可以使用读取控制台输入java.nio
  2. 我可以读取数据System.in使用java.nio
  3. 它会比我现在拥有的输入法快吗?

任何相关信息将不胜感激。

谢谢✌️

霍尔格:

您可以打开一个标准输入

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 extractDoubles(CharBuffer cb) {
    doubles: for(int p = cb.position(); p < cb.limit(); ) {
        while(p < cb.limit() && Character.isWhitespace(cb.get(p))) p++;
        cb.position(p);
        if(cb.hasRemaining()) {
            for(; p < cb.limit(); p++) {
                if(Character.isWhitespace(cb.get(p))) {
                    int oldLimit = cb.limit();
                    double d = Double.parseDouble(cb.limit(p).toString());
                    cb.limit(oldLimit);
                    processDouble(d);
                    continue doubles;
                }
            }
        }
    }
}

这比使用更复杂java.util.Scanner或一个BufferedReaderreadLine()后面split("\\s"),但具有避免正则表达式引擎的复杂度的优点,以及不产生String对于线对象。如果每行或空行有多个数字,即行字符串与数字字符串不匹配,则可以节省字符串构造所固有的复制开销。

此代码仍在处理任意字符集。当您知道期望的字符集并且它是基于ASCII的时,使用轻量级转换而不是,如此答案CharsetDecoder所示,可以提高性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我们可以使用Symfony \ Bundle \ FrameworkBundle \ Test \ WebTestCase进行symfony 2控制台命令测试吗?

如何对可以读取输入并写入控制台的控制台程序进行单元测试

我可以使用mysql或psql控制台连接到Tarantool吗?

我可以使用JavaScript将CSS样式属性打印到控制台吗?

我可以使用 rails 控制台来识别唯一的种子数据吗

我可以使用 python 捕获 Cisco 设备的 CLI(控制台)日志吗

我可以防止控制台使用键盘输入吗?

使用实体的控制台应用程序,我可以使用相同的连接字符串吗?

我可以使用提升类型进行分支控制吗?

我可以使用NUnit3控制台覆盖测试并行运行的实例数吗

我可以使用ssh运行Java jar程序吗?

(如何)我可以使用Java泛型吗?

我可以使用Java为ubuntu开发gui吗

可以给控制台买鼠标吗?

屏蔽从控制台输入的密码:Java

Java控制台输入长度限制

Java比较文件与控制台输入

使用scanf()停止控制台输入

java - 我可以使用Java中的套接字连接2台计算机吗?

C#可以让用户输入设置控制台颜色吗?

控制台可以挂起并在唤醒时要求输入密码吗?

阅读键盘输入而不必始终专注于我的控制台应用程序吗?

可以使用Spring创建控制台应用程序吗?

使用控制台的输入对列表进行段故障初始化向量

我可以使用Jenkins Log Parser隐藏控制台行吗

我可以通过控制台关闭Firefox标签吗?

我可以从 devtools 控制台截取屏幕截图吗?

我们可以从控制台查看消息吗?

我可以截取虚拟控制台的屏幕截图吗?