Detecting and acting on keyboard direction keys in Java

Unfortunately this is not possible in a portable way:

http://forums.sun.com/thread.jspa?threadID=5351637&messageID=10526512

On Windows, reading from System.in will block until enter is pressed, even when you do not use a BufferedReader. Arrows will cycle through the command history. Try it yourself:

import java.io.*;
public class KeyTest {
  public static void main(String[] argv) {
    try {
      InputStreamReader unbuffered = new InputStreamReader(System.in);
      for (int i = 0; i < 10; ++i) {
        int x = unbuffered.read();
        System.out.println(String.format("%08x", x));
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}

Same issue using the Console class (input buffered under Windows, arrow keys intepreted by Windows):

import java.io.*;
public class KeyTest2 {
  public static void main(String[] argv) {
    try {
      Console cons = System.console();
      if (cons != null) {
        Reader unbuffered = cons.reader();
        for (int i = 0; i < 10; ++i ) {
          int x = unbuffered.read();
          System.out.println(String.format("%08x", x));
        }
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}

The Console support issue in Java is well known, I am not sure that this is doable.

This was not initially possible with System.in since it used to work line-based.

Sun eventually added a java.io.Console class.

Here are its JavaDocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html

Once you get the console (I think from System.console), you can get a reader and perhaps read characters from it, but I'm not sure if it includes keys.

Generally, you're supposed to use Swing or AWT if you want access to the keyboard, which is silly.

As of 2007, there was a feature request about it: here


If java.io.console doesn't work for you (I haven't tried that), try JLine. I used it to solve a vaguely similar problem.