Please subscribe to the official Codeforces channel in Telegram via the link: https://t.me/codeforces_official. ×

Flatfoot's blog

By Flatfoot, 6 years ago, In English,

Abstract

In the following I will describe how to read the input in Java. We will examine the Scanner class and then write our own class for faster input reading.

Using the Scanner class

We can read the input using the Scanner class:

import java.util.*;
 
public class Main{
   public static void main(String[] args) {
      // Use the Scanner class
      Scanner sc = new Scanner(System.in);  
      /*
      int n      = sc.nextInt();        // read input as integer
      long k     = sc.nextLong();       // read input as long
      double d   = sc.nextDouble();     // read input as double
      String str = sc.next();           // read input as String
      String s   = sc.nextLine();       // read whole line as String
      */
    }
}

Using the BufferedReader class

However, the Scanner class is slow and may cause a "timelimit exceeded". We can read the input faster with the BufferedReader class. The class "MyScanner" below uses a BufferedReader. The same method names as in the Scanner class have been chosen, e.g. to read the input as an integer we still can use nextInt().

import java.io.*;
import java.util.*;
 
 
public class Main{
   public static void main(String[] args) {
      MyScanner sc = new MyScanner();
      out = new PrintWriter(new BufferedOutputStream(System.out));
      
      // Start writing your solution here. -------------------------------------
   
      /*
      int n      = sc.nextInt();        // read input as integer
      long k     = sc.nextLong();       // read input as long
      double d   = sc.nextDouble();     // read input as double
      String str = sc.next();           // read input as String
      String s   = sc.nextLine();       // read whole line as String

      int result = 3*n;
      out.println(result);                    // print via PrintWriter
      */

      // Stop writing your solution here. -------------------------------------
      out.close();
   }

     

   //-----------PrintWriter for faster output---------------------------------
   public static PrintWriter out;
      
   //-----------MyScanner class for faster input----------
   public static class MyScanner {
      BufferedReader br;
      StringTokenizer st;
 
      public MyScanner() {
         br = new BufferedReader(new InputStreamReader(System.in));
      }
 
      String next() {
          while (st == null || !st.hasMoreElements()) {
              try {
                  st = new StringTokenizer(br.readLine());
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return st.nextToken();
      }
 
      int nextInt() {
          return Integer.parseInt(next());
      }
 
      long nextLong() {
          return Long.parseLong(next());
      }
 
      double nextDouble() {
          return Double.parseDouble(next());
      }
 
      String nextLine(){
          String str = "";
	  try {
	     str = br.readLine();
	  } catch (IOException e) {
	     e.printStackTrace();
	  }
	  return str;
      }

   }
   //--------------------------------------------------------
}

References

  1. FastScanner class used by xenoslash.

  2. Faster input for java – An article by James Brucker

  3. ReadLine in Java

If you know of a simpler/better method for input reading in Java, please post it below.

Edit 1 (30 August 2014)

I added PrintWriter for a faster output.

 
 
 
 
  • Vote: I like it  
  • +5
  • Vote: I do not like it  

»
4 years ago, # |
  Vote: I like it -8 Vote: I do not like it

thanks a lot. could you explain the next() function.

i don't understand why while (st == null || !st.hasMoreElements()) especially !st.hasMoreElements() this part.

and how it is working ? like — int a = sc.nextInt(); int b = sc.nextInt();

if i gave input 1 2 then how can this do like a = 1 and b = 2 ? every time i call nextInt() then it call next() in a new form. so how it can split the output and put those in different variable ? thanks in advance.

  • »
    »
    4 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    What is st? It's StringTokenizer. Read its javadocs.

  • »
    »
    4 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Suppose you had the input

    1 2
    

    Then you can read it like this:

    int a = sc.nextInt();
    int b = sc.nextInt();
    

    If you have multiple lines, let's say n=3 such lines as above, then you can use a for loop. Input:

    3
    1 2
    3 4
    5 6
    

    In the first line we read the number n which tells us how many lines will follow. With a for loop we will read the other numbers:

    int n = sc.nextInt();
    for(int i=0; i<n; i++){
       int a = sc.nextInt(); 
       int b = sc.nextInt();
    }
    
»
4 years ago, # |
  Vote: I like it -6 Vote: I do not like it

Green tutorial? lol

»
4 years ago, # |
  Vote: I like it 0 Vote: I do not like it

great tutorial! Thx a lot for sharing! So are we allowed to use your code for contest? :-)

»
3 years ago, # |
  Vote: I like it -8 Vote: I do not like it

Awesome. Thanks a lot.

»
15 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I could not understand the while loop part. Could anyone explain me that?

»
4 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Thanks a lot. You save my day.