通过扫描仪读取大量输入

时间:2016-10-05 12:33:12

标签: 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字符),则扫描程序停止响应并且无法读取任何数据。

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

注意:这些是无法将数据存储在文件中并从那里读取的方法。从文件中读取数据块是一个不错的选择。但不幸的是,我的申请中没有这样的实施。

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

以下是代码。

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

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

String input = br.readLine();

// Remaining Code

1 个答案:

答案 0 :(得分:0)

这种行为可能是正常的,您必须等待片刻才能扫描器代码执行任何操作。这是一个很大的输入,我想操作系统必须把它放在某个地方,所以在你按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(仍然只有几分钟我才能阅读第一个字符)。

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

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