我正在使用JLine 2(v2.13)与Socket IO一起为我的app创建一个管理控制台,可以通过普通的telnet客户端访问。但是我发现打印出换行符时会打印出奇怪的符号:
act.app.restart restart app^Jact.job.list List jobs
正确的输出应该是:
act.app.restart restart app
act.job.list List jobs
我追溯到代码中,发现导致问题的以下代码行:
另一个奇怪的事情是,当我按下向上箭头来获取历史记录时,控制台会打印出^[[A
并且没有其他任何事情发生。
有没有人有任何想法?
更新:添加了相关的源代码
答案 0 :(得分:0)
编辑:我的不好,我展示的方法是私密的。不过,这不是一个bug - 它的代码正在做它应该做的事情。使用rawPrint的两个公共方法(我把它们放在最后)只用于屏蔽输出,显然用于打印完成,所以ConsoleReader可能不支持你的用例 - 这可能是一个设计bug,但我认为这意味着就是这样。在作为终端配置问题传递的文档中提到了箭头键问题。
ConsoleReader.java在这里:https://github.com/jline/jline2/blob/master/src/main/java/jline/console/ConsoleReader.java
我认为这是最后一个版本等等。
您正在做的是创建一个ConsoleReader,在其上调用println()。 LF显示为^ J.这不是一个错误,因为该方法正在做它应该做的事情:
/*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行的public方法putString(final CharSequence str)和第3715行的printColumns(最终的Collection项目)调用它.putString只在使用屏蔽输出时调用它,所以它对你没用,而printColumns似乎是意思是完成。
也许您应该单独打印行并让ConsoleReader添加换行符?从技术上讲,LF是一个控制代码,禁止ConsoleReader按原样打印控制代码是有意义的。只需将输入分成行,然后逐个打印。