2012-11-09 33 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。我不知道你可以這樣做! –