我使用JLine 2 (v2.13)与Socket一起为我的应用程序创建一个管理控制台,它可以通过普通的telnet客户端访问。然而,我发现它打印出奇怪的符号时,它应该打印一个断线:
act.app.restart restart app^Jact.job.list List jobs正确的输出应该是:
act.app.restart restart app
act.job.list List jobs我在代码中进行了跟踪,发现了引起问题的以下代码行:

另一件奇怪的事情是,当我按向上箭头获取历史记录时,控制台会打印出^[[A,其他任何事情都不会发生。
有人知道吗?
更新:添加了相关源代码

ConsoleReader并分发命令的代码:

更新2
抱歉我消失了一段时间。只要回来,我的项目让我呼吸新鲜空气。下面是所发生的事情:我创建了一个PrintWriter,并将它用作解决^J问题的方法:

但是,当jline2与telnet会话一起使用时,还有许多其他问题:
<TAB>将显示选项卡,而不是激活完整列表。然而,在我点击enter键后,它会给出一个完整的列表和一个错误消息:
<UP>箭头,显示^[[A,按enter键,它将执行我的最后一个命令。但是,我失去了命令行编辑功能。问题仍然存在,我认为应该有办法解决它,只是需要一些指导.
发布于 2016-01-03 11:01:02
编辑:我的错,我展示的方法是私有的。尽管如此,这并不是一个bug,而是代码在做它应该做的事情。使用rawPrint的两个公共方法(我将它们放在末尾)只将其用于屏蔽输出和显然用于打印完成,因此ConsoleReader可能不支持您的用例-it可能是一个设计错误,但我认为应该是这样。在传递为终端配置问题时,文档中会提到箭头键问题。
ConsoleReader.java在这里:https://github.com/jline/jline2/blob/master/src/main/java/jline/console/ConsoleReader.java
我想这是最后一个版本,等等。
您要做的是创建一个调用println()的ConsoleReader。LF显示为^J,从某种意义上说,这不是一个bug,因为该方法正在执行它应该做的事情:
/*3478*/ public void println(final CharSequence s) throws IOException {
print(s);
println();
}这最终呼唤
/*3445*/private int print(final CharSequence buff, int start, int end, int cursorPos) throws IOException {
checkNotNull(buff);
for (int i = start; i < end; i++) {
char c = buff.charAt(i);
if (c == '\t') {
int nb = nextTabStop(cursorPos);
cursorPos += nb;
while (nb-- > 0) {
out.write(' ');
}
} else if (c < 32) {
out.write('^');
out.write((char) (c + '@')); //LF -> ^J这个函数可以做您想做的事情,但是是私有的:
/*3510*/ private void rawPrintln(final String s) throws IOException {
rawPrint(s); //
println();
}
/*3499*/ final void rawPrint(final String str) throws IOException {
out.write(str);
cursorOk = false;
}它可以通过第895行的公共方法putString( CharSequence str)和第3715行的printColumns(最终集合项)调用。putString只在使用屏蔽输出时才调用它,因此对您来说它是无用的,而且printColumns似乎是用于完成的。
也许你应该单独打印行,让ConsoleReader给它们添加新行?从技术上讲,LF是一种控制代码,禁止ConsoleReader按原样打印控制代码是有意义的。把你的输入分成几行,一个一个地打印出来。
https://stackoverflow.com/questions/34467383
复制相似问题