将缩进文本写入文件

时间:2011-08-10 19:52:49

标签: java

我想将文本保存到文件中,以便缩进某些段落(段落的每一行都是缩进的)。我正在使用BufferedWriterScanner或其他任何内容。如何在不计算角色的情况下进行此操作?

2 个答案:

答案 0 :(得分:2)

您必须找到所有换行符,并在每个换行符后插入适当数量的空格。

因此,代码总是需要查看每个字符,并且可能还要解析文本以便找到缩进的位置和数量。

您可以实现处理解析和格式化的java.io.Writer。即使最有效的方法是直接在char缓冲区上工作,它也比创建一个新的String并使用String函数复杂得多,因此通常最好在效率之前寻求稳定性。

如果整个文件的缩进相同,则可以执行一个简单的String.replaceAll(),并用换行符后跟多个空格替换换行符。如果你需要动态缩进,你可能需要解析(找到)缩进级别改变的位置,检查每个字符的换行符或缩进级别是否变化,立即购买它变得复杂......

答案 1 :(得分: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;
  }
}