How to read a single char from the console in Java (as the user types it)?

JavaInputConsole

Java Problem Overview


Is there an easy way to read a single char from the console as the user is typing it in Java? Is it possible? I've tried with these methods but they all wait for the user to press enter key:

char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read();           // Java 6

I'm starting to think that System.in is not aware of the user input until enter is pressed.

Java Solutions


Solution 1 - Java

What you want to do is put the console into "raw" mode (line editing bypassed and no enter key required) as opposed to "cooked" mode (line editing with enter key required.) On UNIX systems, the 'stty' command can change modes.

Now, with respect to Java... see Non blocking console input in Python and Java. Excerpt:

> If your program must be console based, > you have to switch your terminal out > of line mode into character mode, and > remember to restore it before your > program quits. There is no portable > way to do this across operating > systems.

One of the suggestions is to use JNI. Again, that's not very portable. Another suggestion at the end of the thread, and in common with the post above, is to look at using jCurses.

Solution 2 - Java

You need to knock your console into raw mode. There is no built-in platform-independent way of getting there. jCurses might be interesting, though.

On a Unix system, this might work:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

For example, if you want to take into account the time between keystrokes, here's sample code to get there.

Solution 3 - Java

I have written a Java class RawConsoleInput that uses JNA to call operating system functions of Windows and Unix/Linux.

  • On Windows it uses _kbhit() and _getwch() from msvcrt.dll.
  • On Unix it uses tcsetattr() to switch the console to non-canonical mode, System.in.available() to check whether data is available and System.in.read() to read bytes from the console. A CharsetDecoder is used to convert bytes to characters.

It supports non-blocking input and mixing raw mode and normal line mode input.

Solution 4 - Java

There is no portable way to read raw characters from a Java console.

Some platform-dependent workarounds have been presented above. But to be really portable, you'd have to abandon console mode and use a windowing mode, e.g. AWT or Swing.

Solution 5 - Java

Use jline3:

Example:

Terminal terminal = TerminalBuilder.builder()
    .jna(true)
    .system(true)
    .build();

// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();

Solution 6 - Java

I' ve done it using jcurses...

import jcurses.system.InputChar;
import jcurses.system.Toolkit;

//(works best on the local machine when run through screen)
public class readchar3 {
	public static void main (String[] args)
		{
			String st;
			char ch;
			int i;
			st = "";
			ch = ' ';
			i = 0;
			while (true)
				{
      					InputChar c = Toolkit.readCharacter();
					ch = c.getCharacter();
					i = (int) ch;
					System.out.print ("you typed " + ch + "(" + i + ")\n\r");
					// break on '#'
					if (ch == '#') break;
				}
			System.out.println ("Programm wird beendet. Verarbeitung kann beginnen.");
		}
}

Solution 7 - Java

See This

It calls _getch() function from c to read a single char without hitting Enter

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionvictor hugoView Question on Stackoverflow
Solution 1 - JavaChris W. ReaView Answer on Stackoverflow
Solution 2 - Javanes1983View Answer on Stackoverflow
Solution 3 - JavaChristian d'HeureuseView Answer on Stackoverflow
Solution 4 - JavarustyxView Answer on Stackoverflow
Solution 5 - JavaPodView Answer on Stackoverflow
Solution 6 - JavaewingView Answer on Stackoverflow
Solution 7 - Javasimu XDView Answer on Stackoverflow