编辑:我的坏,方法我显示是私人的。不过,这不是一个错误 - 它的代码正在做它应该做的事情。使用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();
}
最终调用
/*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;
}
它可以通过公共方法putString(最终CharSequence str)在行895和printColumns(最终集合项目)在行3715调用。putString只在使用屏蔽输出时调用它,因此它是有用的对你来说,和printColumns似乎是为了完成。
也许你应该分别打印行,让ConsoleReader给他们添加换行符?从技术上讲,LF是一个控制代码,禁止ConsoleReader按原样打印控制代码是有意义的。只需将您的输入分成几行,逐一打印出来。
您是否为您正在使用的客户端配置了终端?您看到的字符可能是用于定位光标的转义序列,除非存在不匹配,例如ANSI而不是vt-100或Windows而不是unix,否则这应该对您正在使用的客户端有意义。确保您正确配置终端应用程序。例如,查看TerminalType AUTO。 –
我在linux mint 17.3上,使用普通的telnet连接到Java服务器。响应telnet连接请求的代码是https://github.com/actframework/actframework/blob/master/src/main/java/act/app/CliServer.java#L56。 –
顺便说一句,我无法在jline2源代码中找到类TerminalType。你能把链接放在这里吗? –