编辑:请注意,以下代码是示例,以显示我想要执行的操作。我真正的问题是,用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
有没有可以在这里做的测试来实现这一目标?
注意:请参阅顶部的编辑部分。
答案 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");
}