BOMコードの有無判定

とあるディレクト配下の全ファイルに関して、
頭にBOMコードが入ってるかを判定したい時のヒント。

----------------------------------------
package pkg;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

public class ReportFilesContainingBomCode {

  //static final byte[] BYTES_UTF8 = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF};//EFBBBF with BOM
  public static final String UTF8 = "-17-69-65";//EFBBBF with BOM
  public static final String UTF8N = "";//without BOM
  public static final String UTF16LE = "-1-2";//FEFF (default)
  public static final String UTF16BE = "-2-1";//FFFE

  public static final String inDir = "C:\tmp";
  public static final String outDir = inDir + "\";
  public static final String reportFileSuffix = ".txt";

  public static List LIST_UTF16BE = new ArrayList();
  public static List LIST_UTF16LE = new ArrayList();
  public static List LIST_UTF8 = new ArrayList();

  /**
   * ザ・メイン
   *
   * @param args
   */
  public static void main(String[] args) {
    System.out.println("★チェック開始★");

    File f = new File(inDir);
    searchFile(f);
    
    //該当ファイル一覧の出力
    postscriptReport("れぽーと_UTF16BE", LIST_UTF16BE);
    postscriptReport("れぽーと_UTF16LE", LIST_UTF16LE);
    postscriptReport("れぽーと_UTF8", LIST_UTF8);
    overwriteReport("チェックしたファイル一覧", checkedList);

    
    
    System.out.println("★チェック終了★");
  }

  /**
   * 既存レポートに上書き
   */
  private static void overwriteReport(String reportName, List report) {
    FileOutputStream fos = null;
    OutputStreamWriter osw = null;
    BufferedWriter bw = null;
   try {
   fos = new FileOutputStream(outDir + reportName + reportFileSuffix);
   osw = new OutputStreamWriter(fos);
   bw = new BufferedWriter(osw);
  
   for (String sentence : report) {
     bw.write(sentence);
     bw.newLine();
   }
  
   } catch (Exception e) {
   e.printStackTrace();
  
   } finally {
     try {
          bw.close();
       osw.close();
       fos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }

   }
  }

  /**
   * 既存レポートに追記
   */
  private static void postscriptReport(String reportName, List report) {
    FileWriter fw = null;
    BufferedWriter bw = null;
   try {
   fw = new FileWriter(outDir + reportName + reportFileSuffix, true);
   bw = new BufferedWriter(fw);
  
   for (String sentence : report) {
     bw.write(sentence);
     bw.newLine();
   }
  
   } catch (Exception e) {
   e.printStackTrace();
  
   } finally {
     try {
          bw.close();
        } catch (IOException e) {
          e.printStackTrace();
        }

   }
  }
  
  public static List checkedList = new ArrayList();

  /**
   * ファイルがディレクトである場合、
   * ファイルに在りつくまでループ。
   * 在りついたらタイプ判定。
   *
   * @param file
   */
  public static void searchFile(File file) {
    if (file.isDirectory()) {
      File[] files = file.listFiles();
      for (int i=0; i        searchFile(files[i]);
    }
    else {
//      System.out.println(file.toString());
      checkedList.add(file.toString());
      if (file.toString().endsWith(".class")) {
        return;
      }
      evaluateFileType(file);
    }
  }

  /**
   * ファイルのタイプ判定。
   *
   * @param file
   */
  private static void evaluateFileType(File file) {
    FileInputStream fis = null;

    try {
      fis = new FileInputStream(file);

      //as byte array
      byte[] bs = new byte[5];
      fis.read(bs);
      String head = "";
      for (Byte b : bs) {
        head = head + b.toString();
      }

      if (head.startsWith(UTF16BE)) {
//        System.out.println("UTF16BE");
        LIST_UTF16BE.add(file.getAbsolutePath());

      } else if (head.startsWith(UTF16LE)) {
//        System.out.println("UTF16LE");
        LIST_UTF16LE.add(file.getAbsolutePath());

      } else if (head.startsWith(UTF8)) {
//        System.out.println("UTF8");
        LIST_UTF8.add(file.getAbsolutePath());

      }
//      System.out.println();


    } catch (Exception e) {
      e.printStackTrace();

    } finally {
      try {
        fis.close();
      } catch (IOException e) {
        e.printStackTrace();
      }

    }

  }

}

tag : BOM

2008-03-11 23:51 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud