2012-11-09 31 views
1

编辑:请注意,下面的代码是示例来显示我想要做什么。我真正的问题是,用Raphael Schweikert的话说,(如果可能的话)你可以检查以前打印的输出吗?换句话说,可以在占位符/*SOME TEST HERE*/上进行哪些测试以确定System.out的光标目前是否在新行的开始位置。有条件地终止当前行System.out.println

这可能是一个奇怪的问题。忍受着我。假设以下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打印输出后出现多余的空行。所以,我希望重写方法2如下:

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

OUTPUT when method1 called: 
method2 
line1 
method2 
line2 
method2 

是否有可以在这里完成,以实现这一目标的任何测试?

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

+0

是关于你如何添加缺少的换行符对这种特殊情况下的问题或这是关于如何(如果可能的话),你可以检查之前打印的一般问题输出? –

+0

第二个。这就是**所有**答案出错的地方。 – ADTC

+0

也这么想!不幸的是,我很确定这是不可能的。就你的应用而言,发送的输出是很好的。它被控制台保留的事实是无关紧要的(可以找出一些本地API查询包含的控制台,但是必须特别针对所述控制台的实现 - 如果可能的话)。你最好的选择是使用自己的函数(或者自己的'PrintStream'实现),它会使用'System.out',但跟踪最后发送的字符。 –

回答

2

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

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

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(); 
    } 
} 
+0

不错的工作=)不过你可能希望使用'System.lineSeparator()'而不是'\ n'来使其与平台无关。 – ADTC

+0

现在,不以(或等于)'\ n''结尾的行分隔符相对不常见。在unix,mac和windows上检测''\ n''很好(因为窗口行分隔符也以'\ n''结尾),并且检测''\ r''所需的开销,''\ n \ r“'或记录分隔符(其转义序列我无法在任何地方找到)不值得增加复杂性。 –

0

变化

System.out.print("line2") 

System.out.println("line2") 

的println打印与新线的东西

纠正一个

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

与其他答案一样,你也错过了这一点。 – ADTC

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

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

OUTPUT

method2 
line1 
method2 
line2 
method2 
+0

对不起,这不是我要找的。请再次阅读问题。我想method2()自动确定是否打印在同一行或新行。 – ADTC

0

使用三元运算

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

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

+0

我猜'newline'是一个布尔变量?无论如何,抱歉,但你的答案也不是我要找的。 – ADTC

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

好的尝试,但忽略了对静态变量的依赖,这里的逻辑是什么?顺便说一句,请阅读我编辑的问题。 – ADTC

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()方法。

(我修改实例来实现这个太)

+0

好的建议,但我认为它不完整。我不想得到最后一个字符,但我宁愿让流记住最后一个字符,并在内部决定是否开始新的一行。 – ADTC

+0

我不明白标题与内容的差异如何。内容应该被认为是标题的详细描述(这是摘要),许多用户在比赛中忽视了第一个回答。标题清楚地表明我想无条件地终止当前行。内容继续通过举例来阐述这意味着什么。它甚至对我如何期望'method2()'被修改的'method2()'的模板有非常具体的指示。但令人失望的是,我得到了5个答案,都提出了甚至没有要求的修改。 – ADTC

+1

对于'System.setOut()'+1。我不知道你可以这样做! –