2013-09-22 49 views
-1

我正在寫一個java反編譯器。爲了給輸出一個很好的縮進,我決定編寫一個名爲TabbedPrintWriter的類來自動將輸出合理地分類。下面的代碼:爲什麼我的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 TabbedPrintWriterTest { 

    public static void main(String[] args) { 
     TabbedPrintWriter writer = new TabbedPrintWriter(System.out, true); 
     writer.println("Hello"); 
     writer.indent(); 
     writer.println("Goodbye"); 
    } 

} 

如果你在看代碼,每個縮進級別應該是四個空格。然而,如果我運行這個,我得到這個輸出:

Hello 
Goodbye 

是的,沒錯。只有一個空間。

這是爲什麼?

+0

你並沒有壓倒一切的關鍵方法。你檢查了API嗎?源代碼? *空格寫出後,不應該調用超級方法* 如果打印多次被調用,然後打印println,你的行動計劃是什麼?你打算在調用print(...)'方法之前選擇tab嗎? –

+0

@HovercraftFullOfEels刪除。你的答案已經過去了。我在讀它。 – tbodt

+0

我刪除了我的答案,因爲它聞起來更像一條評論。 –

回答

0

的代碼和一些調試重寫後,我終於設法得到這個工作:

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--; 
    } 
} 

基本上,我這樣做行緩衝和插入之前,打印出的行縮進。既然它在工作,我就不需要社區的幫助,所以主要的原因是要確保沒有人會分心試圖回答一個不需要回答的問題。並傳播一個工作選項卡式打印作家的話。