java - 通过 Scanner 读取大量输入

标签 java java.util.scanner

我正在尝试获取一些用户输入并在我的程序中处理它们。为此,使用如下所示的 Scanner 类。

Scanner scan = new Scanner(System.in);  
System.out.print("Input : ");
String input = scan.nextLine();

// Process the Data

scan.close();

该程序适用于少量数据。但是如果输入的字符串长度很大(~100K 个字符),Scanner 会停止响应并且无法读取任何数据。

这个问题有什么不同的方法或解决方法吗?

注意:这些不是将数据存储在文件中并从那里读取的可行方法。从文件中读取数据 block 是一个不错的选择。但不幸的是,我的应用程序中没有这样的实现。

编辑: 如前所述,我需要直接从用户(而不是文件)读取数据。无论如何,已经尝试使用 BufferReader。但似乎不能读取大约 100K 个字符的一些数据。

这是下面的代码。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("Input : ");

String input = br.readLine();

// Remaining Code

最佳答案

嗯,这种行为可能是正常的,在扫描程序代码执行任何操作之前,您必须等待片刻。这是一个很大的输入,我猜操作系统必须把它放在某个地方,所以在你按下 enter 的那一刻和 JVM 可以读取它的那一刻之间有一定的时间。

您应该对其进行基准测试,以查看阅读时间根据您的输入而变化了多少。

我编写了一个代码,可以从输入中读取每个字符。这不是一个好的解决方案,因为它肯定比使用 nextLine() 更慢(也更脏),但它会显示您计算机上的缓冲和读取速度:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);  
    Log.d("Input : ");

    StringBuilder test = new StringBuilder();

    String input = "";
    long measure = 0;
    while(input != null){
        input = scan.findInLine("."); // Should consume input one char per one char.

        measure++;
        if(input != null)
            test.append(input.charAt(0));

        if(measure == 1 || measure % 1000 == 0) // displays the reading time of first reads and the next thousand ones
            Log.d("Reading at:"+measure);

    }
    Log.d("End");
    scan.close();

    Log.d("size: "+test.toString().length());
    }
}

(注意:您可以将 Log.d(yourString) 替换为 System.out.println( new Date() +":"+yourString ) )

在您的计算机上进行测试并逐渐增加输入。我不确定响应是线性的。它适用于 50000 个字符,但实际上它与 100.000 个字符相当长(仍然,只有几分钟才能阅读第一个字符)。

编辑:读取之间的时间也随着输入大小的增加而增加……在 100.000 个字符输入下读取 1000 个字符需要 80 秒(50.000 个字符需要几秒钟)。按照这个速度,阅读所有内容需要 2 个多小时。

我不确定,在 System.in.read(); 上循环可能会有更好的结果(但是我不知道行结束符是什么...... \EOF 可能是?),但您仍然可以尝试这样做。同样,我认为这不是一个好的解决方案,但从评论中可以看出,这就是您剩下的全部内容。

关于java - 通过 Scanner 读取大量输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39874081/

相关文章:

java - 如何上传图片并将其保存到数据库中?

java - 除 IMEI 或 IMSI 之外的手机唯一标识符?

java - 如何使用 Joda 将服务器时间转换为本地时间?

java - 如果用户输入特定关键字,如何停止从扫描仪读取?

java - 继续阅读数字,直到使用扫描仪到达换行符

java - if(scanner.nextInt){} 被忽略 (java)

Java:用户输入 - 扫描仪 - 第二次输入后程序挂起

java - 字节数组到位图不显示Java Android

java - 如何增加java运行时堆内存

java.util.Scanner 没有产生正确的结果