Java 为什么';我的TabbedPrintWriter不工作吗?

Java 为什么';我的TabbedPrintWriter不工作吗?,java,printwriter,auto-indent,Java,Printwriter,Auto Indent,我正在写一个java反编译器。为了给输出一个很好的缩进,我决定编写一个名为TabbedPrintWriter的类来自动对输出进行适当的选项卡化。代码如下: import java.io.OutputStream; import java.io.PrintWriter; public class TabbedPrintWriter extends PrintWriter { private static int indentAmount = 4; private int inde

我正在写一个java反编译器。为了给输出一个很好的缩进,我决定编写一个名为
TabbedPrintWriter
的类来自动对输出进行适当的选项卡化。代码如下:

import java.io.OutputStream;
import java.io.PrintWriter;

public class TabbedPrintWriter extends PrintWriter {
    private static int indentAmount = 4;
    private int indent = 0;
    public TabbedPrintWriter(OutputStream out) {
        super(out);
    }

    public TabbedPrintWriter(OutputStream out, boolean autoFlush) {
        super(out, autoFlush);
    }

    @Override
    public void println() {
        super.println();
        for (int i = 0; i <= indentAmount * indent; i++) {
            super.write(' ');
        }
    }

    public void indent() {
        indent++;
    }

    public void unindent() {
        indent--;
    }

}
如果查看代码,每个缩进级别应该有四个空格。但是,如果运行此命令,则会得到以下输出:

你好 再见 是的,没错。只有一个空间


为什么会这样?

在重写代码并进行一些调试之后,我终于成功地实现了这一点:

public class TabbedPrintWriter extends PrintWriter {

    private static int indentAmount = 4;
    private int indent = 0;
    private StringBuilder line = new StringBuilder();

    public TabbedPrintWriter(OutputStream out) {
        super(out);
    }

    public TabbedPrintWriter(OutputStream out, boolean autoFlush) {
        super(out, autoFlush);
    }

    @Override
    public void println() {
        for (int i = 0; i < indentAmount * indent; i++)
            line.insert(0, ' ');
        super.write(line.toString(), 0, line.length());
        line = new StringBuilder();
        super.println();
    }

    @Override
    public void write(int c) {
        line.append((char) c);
    }

    @Override
    public void write(String s, int off, int len) {
        line.append(s, off, len);
    }

    @Override
    public void write(char[] buf, int off, int len) {
        line.append(buf, off, len);
    }

    public void indent() {
        indent++;
    }

    public void unindent() {
        indent--;
    }
}
公共类TabbedPrintWriter扩展了PrintWriter{
私有静态int indentAmount=4;
私有整数缩进=0;
私有StringBuilder行=新StringBuilder();
公共选项卡PrintWriter(输出流输出){
超级(出局);
}
公共选项卡PrintWriter(输出流输出,布尔自动刷新){
超级(输出,自动刷新);
}
@凌驾
public void println(){
对于(int i=0;i

基本上,我在打印行之前进行行缓冲和插入缩进。既然它起作用了,我就不需要社区的帮助了,所以主要的原因是确保没有人在回答一个不需要回答的问题时分心。并传播一个工作标签印刷作家的言论

您没有覆盖足够的关键方法。你查过API了吗?源代码?也不应该在写出空格后调用super方法吗?如果print被多次调用,然后是println,你的行动计划是什么?您是否计划在每次调用
print(…)
方法之前使用tab键?@HovercraftFullOfEels将其删除。你的答案已经通过了。我正在阅读。我删除了我的答案,因为它闻起来更像是一条评论。@HovercraftFullOfEels让我刷新。@HovercraftFullOfEels我查看了
PrintWriter
的源代码,发现唯一输出换行符的代码是
println()
方法。
println()
方法调用私有方法
newline
,但该方法不会在其他任何地方调用。
public class TabbedPrintWriter extends PrintWriter {

    private static int indentAmount = 4;
    private int indent = 0;
    private StringBuilder line = new StringBuilder();

    public TabbedPrintWriter(OutputStream out) {
        super(out);
    }

    public TabbedPrintWriter(OutputStream out, boolean autoFlush) {
        super(out, autoFlush);
    }

    @Override
    public void println() {
        for (int i = 0; i < indentAmount * indent; i++)
            line.insert(0, ' ');
        super.write(line.toString(), 0, line.length());
        line = new StringBuilder();
        super.println();
    }

    @Override
    public void write(int c) {
        line.append((char) c);
    }

    @Override
    public void write(String s, int off, int len) {
        line.append(s, off, len);
    }

    @Override
    public void write(char[] buf, int off, int len) {
        line.append(buf, off, len);
    }

    public void indent() {
        indent++;
    }

    public void unindent() {
        indent--;
    }
}