Search code examples
javaoptimizationinputstreamstdin

What's the fastest way to read from System.in in Java?


I am reading bunch of integers separated by space or newlines from the standard in using Scanner(System.in).

Is there any faster way of doing this in Java?


Solution

  • Is there any faster way of doing this in Java?

    Yes. Scanner is fairly slow (at least according to my experience).

    If you don't need to validate the input, I suggest you just wrap the stream in a BufferedInputStream and use something like String.split / Integer.parseInt.


    A small comparison:

    Reading 17 megabytes (4233600 numbers) using this code

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

    took on my machine 3.3 seconds. while this snippet

    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);
    

    took 0.7 seconds.

    By messing up the code further (iterating over line with String.indexOf / String.substring) you can get it down to about 0.1 seconds quite easily, but I think I've answered your question and I don't want to turn this into some code golf.