在System.out.println之前有条件地终止当前行

时间:2012-11-09 07:21:05

标签: java println system.out

编辑:请注意,以下代码是示例,以显示我想要执行的操作。我真正的问题是,用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

有没有可以在这里做的测试来实现这一目标?

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

6 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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()方法。

(我也修改过这个例子)

答案 2 :(得分:0)

更改

 System.out.print("line2")  

 System.out.println("line2")

println用新行打印东西

更正了一个

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

答案 3 :(得分:0)

method2();
System.out.println("line1");
method2();
System.out.println("line2");
method2();

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

<强>输出

method2
line1
method2
line2
method2

答案 4 :(得分:0)

使用三元运算符

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

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

答案 5 :(得分:0)

static int k=0;
if(k<1)
{
System.out.print("method2.");
k=k+1;
}
else
{
System.out.println("method2");
}