在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万)