便利なコードパーツ集!

やまろうのプログラミングTips

Java

[Java] ディレクトリ配下のファイルを置換するツールを作る

投稿日:

2004/08

「目標設定型人間でありたい!!」でおなじみのやまろうです。

TBSラジオのバツラジって番組で水泳の北嶋康介選手のニュースをいじっていました。
なんでも、北嶋選手は、「金メダルを獲る」って公言して自分を追い詰めていって
力を発揮しているとかって言われてるけれど、そうではなくて、「目標を設定する」
効果があるんじゃないか?という話でした。人間の脳は「目標設定型コンピュータ」
目標を設定するとどうやって達成しようかと、フルに活動をするそうです。
コンピュータは入力から出力することを目的としていますが、脳は、より進化して
生き延びることを目的としているそうです。そして、脳は入力から結果
を導き出すプロセスによって進化するそうです。脳は進化を目的としていて、結果
が目的ではないそうです。だから、本だけ読んでて入力だけではだめってことですね。
プログラミングも覚えたことを使わないと本当に身につきはしませんからね。

ということで目標を設定するということは、脳をより進化させる機会を与えている
ってわけです。

目標を持つことが大事なのは分かっていたけれど、それが脳のしくみとも繋がって
いたんだなぁと感じました。僕はプログラミングに対しては常に目標を持っています。
「あの本読まなきゃ」とか「そのうちあのフレームワーク使ってみよう」とか
いった具合にです。新しいものが次々に生まれて好奇心を駆られるし、探求すれば
するほど、奥が深いことを知らされます。そして、それらは興味や得意意識を持って
いるからだと思います。

「じゃあ、興味のないことや、得意意識のないものはどうすりゃいいのさ?」

僕は常に自分をネガティブに見つめて反省点を探します。
「何が駄目だったのか?」「何か改善できる部分はないか?」
っというふうに、この「駄目な部分」「改善する」っていう目標を見つけ出して
います。

っていっても、なかなかうまく進化できてないんだけどね。
失敗ばっかです。

* * * * *

それでは本題「ディレクトリ配下のファイルを置換するツールを作る」

今回は読者のリクエストに答えての企画!!質問をくれた
人がいました。こんな内容↓

メールマガジンのVol.1で
「この下にあるファイルのコメントを全部置き換えたいんだよなー」
とありますが、どうすればコメントを置き換えられるのでしょうか?

ってことで、「どうすればコメントを置き換えられるのか」
やってみたいと思います。コメントっつうか、文字列ね、別にソースファイルに
限らず全てのテキストファイルに使えるものを作ります。

んでは、ソース行ってみよう!

package tool;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
 * 引数で指定したディレクトリ配下のファイルを指定した文字列で置換える。
 * java tool.Replace [ディレクトリパス] [置換元文字列] [置換文字列]
 * 例 java tool.Replace c:\hoge する します
 * @author yamarou
 */
public class Replace {
  /** 置換元文字列 */
  private static String src;

  /** 置換文字列 */
  private static String replace;

  public static void main(String[] args) throws IOException {
    File file = new File(args[0]);
    src = args[1];
    replace = args[2];
    searchDir(file);
  }

  /**
   * dir 配下のファイルの中に含まれるsrcをreplaceに置換する。
   * @param dir 配下に置換するファイルの存在するディレクトリ
   * @throws IOException
   */
  private static void searchDir(File dir) throws IOException {
    File[] files = dir.listFiles();
    for (int i = 0; i < files.length; i++) {
      File file = files[i];
      if (file.isDirectory()) {
        searchDir(file);
      } else {
        String[] lines = getLines(file.getPath());
        for (int j = 0; j < lines.length; j++) {
          lines[j] = lines[j].replaceAll(src,replace);
        }
        PrintWriter out =
          new PrintWriter(new BufferedWriter(new FileWriter(file.getPath())));
        for (int j = 0; j < lines.length; j++) {
          out.println(lines[j]);
        }
        out.close();
      }
    }
  }

  /**
   * 引数filePathのファイルをテキストストリームで全て読み込んでString配列に
   * 格納して返します。
   * @param filePath テキストファイルのパス
   * @return 読み込んだファイルの中身
   */
  private static String[] getLines(String filePath) throws IOException {
    BufferedReader in = new BufferedReader(new FileReader(filePath));
    ArrayList list = new ArrayList(5000);
    String line = null;
    while ((line = in.readLine()) != null) {
      list.add(line);
    }
    String[] lines = new String[list.size()];
    list.toArray(lines);
    return lines;
  }
}

コマンドラインから
java tool.Replace [ディレクトリパス] [置換元文字列] [置換文字列]
で起動します。

java tool.Replace c:\hoge する します
とやると

[c:\hoge\a.txt元]

CDを購入する。
ラジオを聴取する。
TVを視聴する。

[c:\hoge\a.txt実行後]

CDを購入します。
ラジオを聴取します。
TVを視聴します。

「する」「します」になったわけです。

ソースのポイントはgetLinesでファイルを全て読み込んでファイルを閉じて
そのあと、読み込んだ内容にreplaceAllして、それをファイルに書き込んでいる
所です。全て読み込んで、置換えて、全て書き換えているわけです。
どうでしょうか?質問くれた方、満足していただけましたかな?

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2022 AllRights Reserved Powered by AFFINGER4.