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

问题描述 投票:0回答:3

我正在用 java 编写一个简单的客户端-服务器协议,并且现在正在处理服务器 CLI。我想要做的是在用户输入行的开头有一个

>
。我在控制台中打印
>
字符的函数是 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!
>
java printing console command-line-interface system.out
3个回答
1
投票

您可以捕获 System.out,添加一个侦听任何输出的线程,处理您的任务,然后执行 setOut(PrintStream out)

然后让服务器直接输出到你在setOut中使用的PrintStream

这是我的一个项目中的一些代码: 在服务器中,您将执行 serverOut.println()...

    if(OUTPUT_IN_OVERLAY_CONSOLE || OUTPUT_IN_FILE || !OUTPUT_IN_CONSOLE) {
        try {
            JFrame console = new JFrame("Console");
            console.setSize(720,320);
            final JTextArea tarea = new JTextArea();
            JScrollPane scroll = new JScrollPane(tarea);
            console.add(scroll);                

            final OutputStream consoleOut = System.out;
            final OutputStream fileOut  = new FileOutputStream("output.txt");
            final OutputStream o = new OutputStream() {
                StringBuilder sb = new StringBuilder();
                @Override
                public void write(int b) throws IOException {
                    sb.append((char)b);
                    tarea.setText(sb.toString());
                    tarea.setCaretPosition(sb.length());
                    //tarea.requestFocus();
                }
            };

            OutputStream overrideOut = new OutputStream() {

                @Override
                public void write(int b) throws IOException {
                    if(OUTPUT_IN_CONSOLE) consoleOut.write(b);
                    if(OUTPUT_IN_OVERLAY_CONSOLE) o.write(b);
                    if(OUTPUT_IN_FILE)  fileOut.write(b);
                }
            };
            System.setOut(new PrintStream(overrideOut));

            if(OUTPUT_IN_OVERLAY_CONSOLE) {
                console.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                console.setVisible(true);
            } 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

不要执行

System.setOut(new PrintStream(overrideOut));
,而是创建一个扩展 PrintStream 的类并重写 println(String str) 方法以始终在开头添加一个“">”


0
投票

根据您使用的

console
,您可以通过在服务器行前添加退格字符
\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 上运行。


0
投票

“”在 Eclipse 中不起作用。您(尊敬的先生/妈妈)可以告诉我另一种删除最后一封信的方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.