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 の出力が 1 行に表示される最後の行に注意してください。私はそれを避けたいと思っていますが、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("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 に答える
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 に答える