当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中从控制台读取单个字符(用户键入它)?

如何解决《如何在Java中从控制台读取单个字符(用户键入它)?》经验,为你挑选了5个好方法。

当用户在Java中键入时,是否有一种从控制台读取单个字符的简单方法?可能吗?我尝试过这些方法但他们都在等待用户按下回车键:

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

我开始认为System.in在按下enter之前不知道用户输入.



1> Chris W. Rea..:

您想要做的是将控制台置于"原始"模式(绕过行编辑并且不需要输入键),而不是"熟"模式(需要使用回车键进行行编辑.)在UNIX系统上,'stty'命令可以改变模式.

现在,关于Java ...请参阅Python和Java中的非阻塞控制台输入.摘抄:

如果您的程序必须基于控制台,则必须将终端脱机模式切换到字符模式,并记住在程序退出之前将其恢复.在操作系统中没有可移植的方法.

其中一个建议是使用JNI.再说一遍,这不是很便携.线程末尾的另一个建议,与上面的帖子一样,是使用jCurses.


JCurses也不是非常便携....来自JCurses自述文件:"JCurses由两部分组成:平台独立部分和平台依赖部分,由原生共享库组成,使第一部分可用原始输入和输出操作".
@RyanFernandes对我来说听起来很容易 - 可以在多个系统上运行的单个工具(使用不同的依赖项)

2> nes1983..:

您需要将控制台敲入原始模式.没有内置的平台无关的方式.但是jcurses可能很有趣.

在unix系统上,这可能有效:

String[] cmd = {"/bin/sh", "-c", "stty raw 

例如,如果你想考虑击键之间的时间,这里是示例代码.


"例如......"链接现在已经死了.

3> rustyx..:

没有可移植的方法从Java控制台读取原始字符.

上面已经介绍了一些与平台相关的变通方法.但要真正移植,你必须放弃控制台模式并使用窗口模式,例如AWT或Swing.


我不太明白为什么例如Mono(或CLR)具有适用于所有平台的`System.Console.ReadKey`.Java还为具有平台依赖库和实现的每个平台分发JVM和JRE,因此这不是借口.

4> Christian d'..:

我编写了一个Java类RawConsoleInput,它使用JNA来调用Windows和Unix/Linux的操作系统函数.

在Windows上,它使用_kbhit()_getwch()来自msvcrt.dll.

在Unix上,它用于tcsetattr()将控制台切换到非规范模式,System.in.available()以检查数据是否可用以及System.in.read()从控制台读取字节.A CharsetDecoder用于将字节转换为字符.

它支持无阻塞输入和混合原始模式和普通线路模式输入.


@QPaysTaxes压力测试对于控制台输入很困难.我认为,在这种情况下,在各种环境(不同的Windows/Linux版本,64/32位,Linux通过SSH,Telnet,串行端口或桌面控制台等)中进行测试更为重要.到目前为止,我只在我的私人测试工具中使用它.但与其他解决方案(如使用Jansi的JLine2)相比,源代码相对较小.所以没有太多可能出错的地方.我写了它,因为JLine2不支持单字符输入而没有阻塞.

5> Pod..:

使用jline3:

例:

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有