Java 删除添加到System.out的最后一个字符

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,

我正在用java编写一个简单的客户机-服务器协议,现在正在处理服务器CLI。我想做的是在用户输入行的开头有一个
。我在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
>