2013-09-22 3 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 (...)'? –

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

В принципе, я буферизацию строки и вставить отступ перед печатью из линии. Теперь, когда он работает, мне не понадобится помощь сообщества, поэтому основная причина заключается в том, чтобы никто не отвлекался, пытаясь ответить на вопрос, который не нуждается в ответе. И распространить слово рабочего печатного автора.

Смежные вопросы