1

编辑:请注意,下面的代码是显示我想要做什么的示例。我真正的问题是,用 Raphael Schweikert 的话来说,如何(如果可能的话)检查以前打印的输出?换句话说,可以在占位符处放置什么测试/*SOME TEST HERE*/来确定光标System.out当前是否在新行的开头。

这可能是一个奇怪的问题。忍受我。假设以下 Java 代码:

public void method1() {
    method2();
    System.out.println("line1");
    method2();
    System.out.print("line2");
    method2();
}

public void method2() {
    System.out.println("method2");
}

OUTPUT when method1 called:
method2
line1
method2
line2method2

请注意,line2 和 method2 打印输出出现在一行中的最后一行。我想避免这种情况,但我也不希望在 line1 打印输出后出现额外的空行。所以我想重写method2如下:

public void method2() {
    if (/* SOME TEST HERE */) {
        System.out.println();
    }
    System.out.println("method2");
}

OUTPUT when method1 called:
method2
line1
method2
line2
method2

有没有可以在这里进行的测试来实现这一点?

注意:请参阅顶部的编辑部分。

4

6 回答 6

2

不幸的是,我很确定这是不可能的。就您的应用程序而言,已发送的输出就是:已发送。如果您不想编写一些(可能仅限 JNI)代码来与封闭的控制台交互,那么您最好的希望是使用您自己的实现来跟踪发送的换行符。

我尝试使用包装 System.out(或 System.err)的 PrintStream 来执行此操作。这绝不是完整的,也缺乏原件的同步访问保护。此外,它依赖于超类的一些实现细节,这是一件坏事™。

import java.io.IOException;
import java.io.PrintStream;
public class LineEndingAwarePrintStream extends PrintStream {
    private boolean didEndLine;

    public LineEndingAwarePrintStream(PrintStream inner) {
        super(inner);
        didEndLine = false;
    }   

    @Override
    public void print(char arg0) {
        didEndLine = arg0 == '\n';
        super.print(arg0);
    }
    @Override
    public void print(char[] arg0) {
        if(arg0.length > 0) {
            didEndLine = arg0[arg0.length-1] == '\n';
        }
        super.print(arg0);
    }
    @Override
    public void print(String arg0) {
        if(arg0.length() > 0) {
            didEndLine = arg0.charAt(arg0.length()-1) == '\n';
        }
        super.print(arg0);
    }

    @Override
    public void println() {
        super.println();
        didEndLine = true;
    }
    @Override
    public void println(boolean arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(char arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(char[] arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(double arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(float arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(int arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(long arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(Object arg0) {
        super.println(arg0);
        didEndLine = true;
    }
    @Override
    public void println(String arg0) {
        super.println(arg0);
        didEndLine = true;
    }

    @Override
    public void print(boolean b) {
        super.print(b);
        didEndLine = false;
    }
    @Override
    public void print(double d) {
        super.print(d);
        didEndLine = false;
    }
    @Override
    public void print(float f) {
        super.print(f);
        didEndLine = false;
    }
    @Override
    public void print(int i) {
        super.print(i);
        didEndLine = false;
    }
    @Override
    public void print(long l) {
        super.print(l);
        didEndLine = false;
    }
    @Override
    public void print(Object obj) {
        super.print(obj);
        didEndLine = false;
    }
    public void assertNewLine() {
        if(!didEndLine) {
            this.println();
        }
    }

    public void printOnNewLine(Object arg) {
        this.assertNewLine();
        this.println(arg);
    }

    public static void main(String[] arg) {
        LineEndingAwarePrintStream out = new LineEndingAwarePrintStream(System.out);
        out.println("New line");
        out.printOnNewLine("Not two newlines");
        out.print("New line");
        out.println("No new line");
        out.print("New line");
        out.printOnNewLine("New line");
        out.append('3');
        out.printOnNewLine("New line");
        out.append("Test");
        out.append('\n');
        out.printOnNewLine("Not two newlines");
        out.append("Test\n");
        out.printOnNewLine("Not two newlines");
        out.close();
    }
}
于 2012-11-09T13:44:28.150 回答
2

啊,对不起,问题的标题与它的内容不同......

如果您想知道发送给System.out您的最后一个字符应该编写您自己的PrintStream派生类

class PrintStreamEx extends PrintStream {

   // replacing out code
   static PrintStream oldout = System.out;
   static PrintStreamEx newout = new PrintStreamEx();

   static {
        System.setOut(newout);
   }

   private char lastchar;

   // wrap old out
   public PrintStreamEx() {
       super(oldout);
   }

   // intercept all writing methods 
   // for example

   @Overrides
   public void print(String s) {
       lastchar = s.charAt(s.lenght()-1);
       super.print(s);
   }

   // provide a method to get last char
   public char lastChar() {
        return lastchar;
   }


}

并包裹System.out进去。在您的班级内,您将能够保持发送的最后一个字符,如上所示。

要将您的课程设置为工作,您应该使用System.setOut()方法。

(我也修改了示例来实现这个)

于 2012-11-09T16:47:45.467 回答
0

改变

 System.out.print("line2")  

 System.out.println("line2")

println 用新行打印东西

更正了一个

public void method1() {
method2();
System.out.println("line1");
method2();
System.out.println("line2");
method2();
}
于 2012-11-09T07:22:45.383 回答
0
method2();
System.out.println("line1");
method2();
System.out.println("line2");
method2();

System.out.print()将在同一行打印输出

输出

method2
line1
method2
line2
method2
于 2012-11-09T07:24:16.177 回答
0

使用三元运算符

System.out.print("method2" + (newline?"\n":""));

或者

System.out.print((newline?"\n":"") + "method2");

于 2012-11-09T07:25:17.210 回答
0
static int k=0;
if(k<1)
{
System.out.print("method2.");
k=k+1;
}
else
{
System.out.println("method2");
}
于 2012-11-09T07:26:56.003 回答