首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除添加到System.out的最后一个字符

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

Stack Overflow用户
提问于 2012-11-22 08:11:06
回答 2查看 5K关注 0票数 0

我正在用java编写一个简单的Client-Server协议,现在正在处理服务器CLI。我想要做的是在用户输入行的开头有一个>。我在控制台中打印>字符的函数是consoleWriteln:

代码语言:javascript
复制
public static void consoleWriteln(String message) {
    System.out.println(message);
    System.out.print(">");
}

使用此函数时,服务器启动,但字符显示在每行的开头。

代码语言:javascript
复制
Server running, listening on port 25565
>Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
>Tim: I agree!
>

当从客户端传入任何内容时,或从服务器CLI广播某些内容时,都会调用上述函数。

我怎么才能让它只在用户输入行上呢?即:

代码语言:javascript
复制
Server running, listening on port 25565
Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
Tim: I agree!
>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-22 08:18:57

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

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

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

代码语言:javascript
复制
    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();
        }
    }

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

票数 1
EN

Stack Overflow用户

发布于 2012-11-22 08:49:07

这是一个测试程序

代码语言:javascript
复制
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中运行这个程序时,我得到以下输出:

代码语言:javascript
复制
>line1
>line2
line3
>

请注意,程序确实打印出了line3之前的提示符,但是退格符ate提示符,方法是将光标向后移动一个字符并覆盖该字符。

在您的示例中,当您有来自服务器的广播内容时,只需在调用consoleWriteln之前在消息中添加\b

然而,这并不总是有效的。它肯定不能在我的Intellij控制台窗口中工作--它似乎只是忽略了退格符。因此,这种方法的成功取决于您使用哪个控制台以及您的控制台如何处理退格键。

如果你使用系统提供的控制台程序(bash或cmd.exe)来运行你的程序,它应该可以在Mac,Linux和Windows上运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13504090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档