Gel*_*Luo 8 java telnet jline stty jline2
我正在使用JLine 2(v2.13)和Socket IO为我的应用程序创建一个管理控制台,可以通过普通的telnet客户端访问.但是我发现打印出换行符时会打印出奇怪的符号:
act.app.restart restart app^Jact.job.list List jobs
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是:
act.app.restart restart app
act.job.list List jobs
Run Code Online (Sandbox Code Playgroud)
我追溯到代码,发现以下代码行导致了麻烦:
另一个奇怪的事情是当我按下向上箭头来获取历史记录时,控制台打印出来^[[A
并且没有其他任何事情发生.
有谁有想法吗?
更新:添加了相关的源代码
ConsoleReader
和分派命令的代码:更新2
对不起,我已经消失了一段时间.刚回来,因为我的项目让我呼吸新鲜空气.所以这就是发生的事情:我创建了一个PrintWriter
并将其用作^J
问题的解决方法:
但是,jline2
与telnet会话一起使用时还有许多其他问题:
<TAB>
显示选项卡而不是激活完整列表.但是,在我按下回车键后,它会给我一个完整的列表以及一条错误消息:
<UP>
箭头,显示^[[A
,按回车键,它将执行我的最后一个命令.但是我丢失了命令行编辑问题仍然存在,我相信应该有办法解决它只需要一些指导......
小智 0
编辑: 我的错,我展示的方法是私有的。不过,这不是一个错误——它是代码在做它应该做的事情。使用 rawPrint 的两个公共方法(我将它们放在最后)仅将其用于屏蔽输出并且显然用于打印完成,因此 ConsoleReader 可能不支持您的用例 - 这可能是一个设计错误,但我认为这意味着就这样。文档中提到了箭头键问题作为终端配置问题。
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();
}
Run Code Online (Sandbox Code Playgroud)
最终调用
/*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
Run Code Online (Sandbox Code Playgroud)
这个函数可以做你想做的事情,但是是私有的:
/*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;
}
Run Code Online (Sandbox Code Playgroud)
可以通过第 895 行的公共方法 putString(final CharSequence str) 和第 3715 行的 printColumns(final Collection items) 来调用它。 putString 仅在使用屏蔽输出时调用它,因此它对您来说毫无用处,而 printColumns 似乎用于完成。
也许您应该单独打印行并让 ConsoleReader 添加换行符?从技术上讲,LF 是一个控制代码,因此禁止 ConsoleReader 按原样打印控制代码是有意义的。只需将输入分成几行,然后逐行打印即可。
归档时间: |
|
查看次数: |
355 次 |
最近记录: |