読者です 読者をやめる 読者になる 読者になる

再帰検索+テキストデータの連結

WSDLより、Javaソースを作成すると、web.xmlとかがWSDLファイル数分できました。
で、それらを連結しなくちゃいけないんだけど、ファイル数が20ぐらいあるので、プログラムを組んでみました。

ただ、web.xmlの宣言部やROOT要素は共通なので、不要。
よって、web.xmlの1,2,最終行は連結しない。
以下、ソース。

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.util.ArrayList;
import java.util.List;

public class Concat {

    /** 指定フォルダ用定数 */
    private static final String FOLDER_PATH = "C:\\Users\\Public\\Desktop\\Test";

    /** 指定ファイル名用定数 */
    private static final String FILE_NAME = "web.xml";

    /**
     * メイン処理。
     * 
     * @param args 使用しません
     * @throws Exception 実行時例外
     */
    public static void main(String[] args) throws Exception {
        // 指定フォルダ
        File file = new File(FOLDER_PATH);

        // ファイルリストの取得
        List<File> list = getFile(file, FILE_NAME);

        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter(FILE_NAME));
            for (File f : list) {
                List<String> lines = getLineText(f);

                for (int i = 0; i < lines.size(); i++) {
                    if (i == 0 || i == 1 || i == lines.size() - 1) {
                        // 特定の行のみコピーしない
                        continue;
                    }
                    bw.write(lines.get(i));
                    bw.newLine();
                }
            }
        } finally {
            if (bw != null) {
                bw.close();
            }
        }
    }

    /**
     * 指定ファイル内のテキストを、行単位でリストにし返す。
     * 
     * @param file 指定ファイル
     * @return 行単位のテキストデータ
     * @throws IOException 入出力例外
     */
    private static List<String> getLineText(File file) throws IOException {
        // 返却値
        List<String> lines = new ArrayList<String>();

        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(file));
            String line = null;
            // ファイルが存在する間ループ
            while ((line = br.readLine()) != null) {
                lines.add(line);
            }
        } finally {
            if (br != null) {
                br.close();
            }
        }

        return lines;
    }

    /**
     * ファイル名を指定し、指定フォルダ以下のファイルリストを再帰的に取得します。
     * 
     * @param folder 指定フォルダ
     * @param fileName ファイル名
     * @return ファイルリスト
     */
    private static List<File> getFile(File folder, String fileName) {
        // 返却値
        List<File> list = new ArrayList<File>();

        File[] files = folder.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                // 同一ファイル名を再帰検索
                list.addAll(getFile(file, fileName));
                continue;
            }

            if (file.getName().equals(fileName)) {
                // 同一ファイル名のパスを追加
                list.add(file);
            }
        }

        return list;
    }
}

getFileで再帰的にweb.xmlを検索。
mainのループの中でファイルのテキストデータを取得し、
その指定行数以外をReaderに出力。
って流れかな?

再帰って久々に使った・・・。