2011-08-10 52 views
0

我想將文本保存到文件中,以便某些段落縮進(段落的每一行都縮進)。我正在使用BufferedWriterScanner或其他。我會如何去做這個不計數字符?將縮進文本寫入文件

+1

那麼,你使用的是什麼類?爲什麼你需要數字字符?你有沒有做過任何嘗試?如果是這樣,我們可以看到你的代碼? – Jeffrey

+0

我正在使用BufferedWriter,但我無論如何都陷入了困境。我沒有做出任何嘗試,因爲我無法找到合適的班級使用。我不認爲我需要數字,但它是一個可行的黑客。謝謝蘇格拉底。 –

+0

你需要一個算法來確定一個給定的段落的縮進。你有嗎? –

回答

2

您必須找到所有換行符,並在每個換行符後面插入適當的空格。

因此,代碼將始終需要查看每個字符,並且可能還需要解析文本才能找到要縮進的位置和位置。

你可以實現你的java.io.Writer來處理解析和格式。儘管最有效的方法是直接在char緩衝區上工作,但它比創建一個新的String並使用String函數複雜得多,因此它通常最好在效率之前達到穩定。

如果縮進整個文件一樣,你可以做一個簡單的String.replaceAll(),並以新行後跟一個數量的空格代替換行。如果你需要動態的縮進,你可能需要解析(找到),其中縮進級別的變化,如果換行或縮進級別變更確認每一個字符,現在買它越來越複雜......

0

這裏有一個解決方案。該方法用縮進取代所有換行符。縮進級別需要撥打indent()。要取消預約,請撥打unindent()方法。

public class IndentPrintWriter extends java.io.PrintWriter 
{ 
    private boolean newLine; 
    private String singleIndent = " "; 
    private String currentIndent = ""; 

    public IndentPrintWriter(Writer pOut, String indent) 
    { 
    super(pOut); 
    this.singleIndent = indent; 
    } 

    public void indent() 
    { 
    currentIndent += singleIndent; 
    } 

    public void unindent() 
    { 
    if (currentIndent.isEmpty()) return; 
    currentIndent = currentIndent.substring(0, currentIndent.length() - singleIndent.length()); 
    } 

    @Override 
    public void print(String pString) 
    { 
    // indent when printing at the start of a new line 
    if (newLine) 
    { 
     super.print(currentIndent); 
     newLine = false; 
    } 

    // strip the last new line symbol (if there is one) 
    boolean endsWithNewLine = pString.endsWith("\n"); 
    if (endsWithNewLine) pString = pString.substring(0, pString.length() - 1); 

    // print the text (add indent after new-lines) 
    pString = pString.replaceAll("\n", "\n" + currentIndent); 
    super.print(pString); 

    // finally add the stripped new-line symbol. 
    if (endsWithNewLine) println(); 
    } 

    @Override 
    public void println() 
    { 
    super.println(); 
    newLine = true; 
    } 
}