在Java中读取System.in最快的方法是什么?

我正在使用Scanner(System.in)读取由空间或换行符分隔的一串整数。

在Java中做这个有更快的方法吗?

在Java中做这个有更快的方法吗?

是。 扫描仪相当慢(至less根据我的经验)。

如果你不需要validationinput,我build议你把这个stream封装在一个BufferedInputStream中,并使用类似String.split / Integer.parseInt东西。


小小的比较:

使用此代码读取17兆字节 (4233600个数字)

 Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) sum += scanner.nextInt(); 

我的机器上了3.3秒 。 而这个片段

 BufferedReader bi = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = bi.readLine()) != null) for (String numStr: line.split("\\s")) sum += Integer.parseInt(numStr); 

花了0.7秒

通过进一步搞乱代码(用String.indexOf / String.substring迭代),你可以很容易的把它弄到0.1秒左右,但是我想我已经回答了你的问题,我不想把它变成一些代码高尔夫。

我创build了一个像Java的Scanner一样工作的小型InputReader类,但是它的速度超过了许多数量级,实际上,它的性能也超过了BufferedReader。 这是一个条形图,显示了我创build的InputReader类从标准input读取不同types的数据的性能:

在这里输入图像说明

以下是使用InputReader类从System.in中find所有数字的总和的两种不同方法:

 int sum = 0; InputReader in = new InputReader(System.in); // Approach #1 try { // Read all strings and then parse them to integers (this is much slower than the next method). String strNum = null; while( (strNum = in.nextString()) != null ) sum += Integer.parseInt(strNum); } catch (IOException e) { } // Approach #2 try { // Read all the integers in the stream and stop once an IOException is thrown while( true ) sum += in.nextInt(); } catch (IOException e) { } 

您可以通过数字方式从System.in中读取数字。 看看这个答案: https : //stackoverflow.com/a/2698772/3307066 。

我在这里复制代码(几乎没有修改)。 基本上,它读取整数,由不是数字的任何东西分开。 (感谢原作者)

 private static int readInt() throws IOException { int ret = 0; boolean dig = false; for (int c = 0; (c = System.in.read()) != -1; ) { if (c >= '0' && c <= '9') { dig = true; ret = ret * 10 + c - '0'; } else if (dig) break; } return ret; } 

在我的问题,这个代码是约。 比使用StringTokenizer快了2倍,这比String.split(" ")快。 (这个问题涉及读100万个整数,每个100万)