リードコード-BayesFileFormatter

2671 ワード

使用シヨウ:ファイルの読み書き、フォルダの下でファイル処理を巡回
package org.apache.mahout.classifier;
public final class BayesFileFormatter
2つの処理方法が提供されています
フォルダの下のすべてのファイルを処理して単一のドキュメントに書き込み、ファイルをそれぞれドキュメントに書き込みます.
単一ドキュメント

  public static void collapse(String label, Analyzer analyzer, File inputDir,
                              Charset charset, File outputFile) throws IOException {
    Writer writer = Files.newWriter(outputFile, charset);
    try {
      inputDir.listFiles(new FileProcessor(label, analyzer, charset, writer));
      // listFiles() is called here as a way to recursively visit files,
      // actually
    } finally {
      IOUtils.quietClose(writer);
    }
  }

マルチドキュメント

  public static void format(String label, Analyzer analyzer, File input,
                            Charset charset, File outDir) throws IOException {
    if (input.isDirectory()) {
      input.listFiles(new FileProcessor(label, analyzer, charset, outDir));
    } else {
      Writer writer = Files.newWriter(new File(outDir, input.getName()), charset);
      try {
        writeFile(label, analyzer, input, charset, writer);
      } finally {
        IOUtils.quietClose(writer);
      }
    }
  }

処理はすべてファイルの遍歴にかかわる
実装の核心は既存のlistFileメソッドを利用して、FileFilterを書き換え、FileFilterはもともとファイルフィルタリングに用いられていたが、現在は処理プロセスに参加し、内部クラスFileProcessorはFileFilterインタフェースを実現した.
処理後に単一ファイルに書き込むか、別々に書き込むかは、writerのターゲットに依存し、writerを制御することで異なる効果を達成します.

    @Override
    public boolean accept(File file) {
      if (file.isFile()) {
        Writer theWriter = null;
        try {
          if (writer == null) {
            theWriter = Files.newWriter(new File(outputDir, file.getName()), charset);
          } else {
            theWriter = writer;
          }
          writeFile(label, analyzer, file, charset, theWriter);
          if (writer != null) {
            // just write a new line
            theWriter.write('
'); } } catch (IOException e) { // TODO: report failed files instead of throwing exception throw new IllegalStateException(e); } finally { if (writer == null) { IOUtils.quietClose(theWriter); } } } else { file.listFiles(this); } return false; } }