Java 删除添加到System.out的最后一个字符
我正在用java编写一个简单的客户机-服务器协议,现在正在处理服务器CLI。我想做的是在用户输入行的开头有一个Java 删除添加到System.out的最后一个字符,java,printing,console,command-line-interface,system.out,Java,Printing,Console,Command Line Interface,System.out,我正在用java编写一个简单的客户机-服务器协议,现在正在处理服务器CLI。我想做的是在用户输入行的开头有一个。我在console中打印字符的函数是consoleWriteln: public static void consoleWriteln(String message) { System.out.println(message); System.out.print(">"); } 使用此功能,服务器将启动,但字符将显示在每行的开头 Server running,
。我在console中打印
字符的函数是consoleWriteln:
public static void consoleWriteln(String message) {
System.out.println(message);
System.out.print(">");
}
使用此功能,服务器将启动,但字符将显示在每行的开头
Server running, listening on port 25565
>Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
>Tim: I agree!
>
当从客户端传入任何内容或从服务器CLI广播某些内容时,将调用上述函数
我怎样才能只在用户输入线上使用它呢?即:
Server running, listening on port 25565
Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
Tim: I agree!
>
您可以捕获System.out,添加侦听任何输出的线程,处理任务,然后执行setOut(打印流输出) 然后,将服务器输出直接输出到放样中使用的PrintStream 以下是我的一个项目中的一些代码: 在服务器中,您将执行serverOut.println()
而不是执行
System.setOut(新的PrintStream(overrideOut))
,创建一个扩展PrintStream的类,并重写println(String str)方法以始终在开头添加“>”根据您使用的控制台,您可以通过使用退格字符\b
预挂起服务器行来模拟所需的行为。这是一个测试程序
public class Prompt
{
public static void main(String [] args)
{
System.out.print(">");
System.out.println("line1");
System.out.print(">");
System.out.println("line2");
System.out.print(">");
System.out.println("\bline3");
System.out.print(">");
System.out.println("");
}
}
当我在bash shell中运行此程序时,我得到以下输出:
>line1
>line2
line3
>
请注意,程序确实在line3
之前打印了提示,但是退格字符ate
通过将光标向后移动一个字符并覆盖该字符来打印提示字符
在您的情况下,当您从服务器进行广播时,只需在调用consoleWriteln之前将\b
预先发送到消息
然而,这并不总是有效的。它在我的Intellij控制台窗口中肯定不起作用——它似乎只是忽略了退格字符。因此,这种方法的成功取决于您使用的控制台以及控制台如何处理退格
如果您使用系统提供的控制台程序(bash或cmd.exe)来运行您的程序,它应该可以在Mac、Linux和Windows上运行。如果您在打印
后从服务器获得一行,会发生什么情况?来自用户输入的任何一行都应该由
字符开头。任何其他行前面都不应有字符。您想何时打印它?听起来你好像在预测未来。
>line1
>line2
line3
>