Java 通过扫描仪读取较大的输入

Java 通过扫描仪读取较大的输入,java,java.util.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类

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

// Process the Data

scan.close();
该程序可以很好地处理少量数据。但如果输入字符串长度很大(约100K个字符),扫描器将停止响应并无法读取任何数据

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

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

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

下面是代码

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());
    }
}
(注意:您可以用
System.out.println(新日期()+“:“+您的字符串)
替换
Log.d(您的字符串)

在计算机上进行测试,并逐渐增加输入。我不确定反应是线性的。它可以很好地处理50000个字符,但事实上,处理100.000个字符时它相当长(不过,在我可以读取第一个字符之前只有几分钟)

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


我不确定,在
System.in.read()上循环
可能会有更好的结果(我不知道行尾字符是什么…
\EOF
可能?),但您也可以尝试一下。再说一次,我认为这不是一个好的解决方案,但从评论中可以看出,您只剩下这些了。

使用流读取大数据
BufferedReader br=new BufferedReader(new InputStreamReader(System.in))尝试使用BufferedReader()?可能与@px06重复感谢您提供的答案链接。但如问题中所述,没有从文本文件()读取数据的选项