[JAVA] ランチャー、FEZ、ファイル書き換え、レジストリ読み取りとか | プログラム垂れ流し

[JAVA] ランチャー、FEZ、ファイル書き換え、レジストリ読み取りとか

あー、メモです。
--------------------------------------------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import com.roxes.win32.Registry;
import com.roxes.win32.Win32Exception;

/**
* FEZを自分仕様で起動する為のやつ (GLOBALDEF.INI,INPUTDEF.INIを編集してから起動)
*
* @author tyoku2
*
*/
public class MyfezLunch {

 /** レジストリ格納先 */
 private static final String REG_DIR = "SOFTWARE\\Wow6432Node\\Gamepot\\FantasyEarthZero";
 /** レジスト名 */
 private static final String REG_NAME = "Install_Dir";
 /** FEZ起動ファイル */
 private static final String FEZ_EXE = "FEzero.exe";
 /** GLOBALDEF.INI ディレクトリ */
 private static final String DIR_GLOBAL_INI = "Settings\\";
 /** INPUTDEF.INI ディレクトリ */
 private static final String DIR_INPUT_INI = "DATA\\";
 /** GLOBALDEF.INI */
 private static final String FILE_GLOBALDEF_INI = "GLOBAL.INI";
 /** INPUTDEF.INI */
 private static final String FILE_INPUTLDEF_INI = "INPUTDEF.INI";
 /** バックアップ先ディレクトリ */
 private static final String DIR_BK = "myfezBackup\\";

 /** 独自設定切り分け用 */
 private static final String MYCONF = "MYCONF";
 /** myconfのグローバルの値 */
 private static final String MYCONF_GLOBAL = "GLOBAL";

 private static Boolean isEditGlobalIni = false;
 private static Boolean isEditInputIni = false;

 /**
  * メインクラス
  */
 public static void main(String[] args) {

  // FEZの設定ファイルバックアップ
  backupIniFile();

  // FEZの設定ファイル書き換え
  editIniFile(getMyConf("sjis"));

  // FEZ起動
  execFez();
 }

 /**
  * FEZの設定ファイルのバックアップを取る
  */
 private static void backupIniFile() {
  // バックアップファイルの末尾に付ける文字列
  String datetime = new SimpleDateFormat("yyyyMMdd").format(Calendar
    .getInstance().getTime());

  // 作業ディレクトリ取得
  String sCurrentDir = new File(".").getAbsoluteFile().getParent();

  String repinstallDir = getInstallDirectory().replaceAll("\\\\",
    "\\\\\\\\");
  // GLOBALDEF.INIファイルバックアップ
  fileCopy(new File(repinstallDir + DIR_GLOBAL_INI + FILE_GLOBALDEF_INI),
    new File(sCurrentDir + "\\" + DIR_BK + datetime + "\\"));

  // INPUTDEF.INIファイルバックアップ
  fileCopy(new File(repinstallDir + DIR_INPUT_INI + FILE_INPUTLDEF_INI),
    new File(sCurrentDir + "\\" + DIR_BK + datetime + "\\"));
 }

 /**
  * ファイルのコピーを行う
  */
 private static boolean fileCopy(File from, File to) {
  ArrayList<String> fileCpyCmd = null;

  if (!from.exists()) {
   return false;
  }

  // ディレクトリがなければ作成
  if (!to.exists()) {
   to.mkdirs();
  }

  fileCpyCmd = new ArrayList<String>();
  fileCpyCmd.add("cd " + from.getParent());
  fileCpyCmd.add("copy /y \"" + from.getName() + "\" \"" + to.getPath() + "\"");
  execCmd(fileCpyCmd);
  return true;
 }

 /**
  * GLOBALDEF.INI INPUTDEF.INIをmyConfに合わせて書き換える。
  *
  * @param myConf
  */
 private static void editIniFile(ArrayList<ArrayList<String>> myConf) {
  ArrayList<String> myconftemp = null;
  String repinstallDir = getInstallDirectory().replaceAll("\\\\",
    "\\\\\\\\");
  File inputInifile = new File(repinstallDir + DIR_INPUT_INI
    + FILE_INPUTLDEF_INI);
  File globalInifile = new File(repinstallDir + DIR_GLOBAL_INI
    + FILE_GLOBALDEF_INI);
  ArrayList<String> inputIni = getFileLines(inputInifile, "sjis");
  ArrayList<String> globalIni = getFileLines(globalInifile, "sjis");

  for (int i = 0; i < myConf.size(); i++) {
   myconftemp = myConf.get(i);
   if (myconftemp.get(0).split("=")[1].equals(MYCONF_GLOBAL)) {
    globalIni = replaceLine(globalIni, myconftemp, false);
    if (isEditGlobalIni) {
     iniReWrite(globalInifile, globalIni);
    }
   } else {
    inputIni = replaceLine(inputIni, myconftemp, true);
    if (isEditInputIni) {
     iniReWrite(inputInifile, inputIni);
    }
   }
  }
 }

 /**
  * 編集した内容をファイルに書き出す
  *
  * @param file
  *   対象ファイル
  * @param lines
  *   置き換える文字列配列
  */
 private static void iniReWrite(File rewritefile, ArrayList<String> lines) {
  try {
   //ファイル削除
   rewritefile.delete();

   // 出力ストリームの生成(追記モード)
   FileOutputStream fos = new FileOutputStream(rewritefile);
   OutputStreamWriter osw = new OutputStreamWriter(fos);
   PrintWriter pw = new PrintWriter(osw);

   // ファイルへの書き込み
   for (int i = 0; i < lines.size(); i++) {
    pw.println(lines.get(i));
   }

   // 後始末
   pw.close();

   // エラーがあった場合は、スタックトレースを出力
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * ファイルを行ごとにArrayListに格納して返却
  *
  * @param file
  * @param encode
  * @return ArrayList
  */
 private static ArrayList<String> getFileLines(File file, String encode) {
  ArrayList<String> lines = new ArrayList<String>();
  try {
   BufferedReader fin = new BufferedReader(new InputStreamReader(
     new FileInputStream(file), encode));
   String line;
   while ((line = fin.readLine()) != null) {
    lines.add(line);
   }
  } catch (IOException e) {
   System.err.println(file.getPath() + " :: Cannot access.");
  }
  return lines;
 }

 /**
  * ファイル内の値を置換
  *
  * @param befName
  * @param befVal
  * @param aftName
  * @param aftVal
  * @return
  */
 private static ArrayList<String> replaceLine(ArrayList<String> iniline,
   ArrayList<String> myconftmp, Boolean confName) {
  String target = myconftmp.get(0).split("=")[1];
  ArrayList<String> retlines = new ArrayList<String>();
  Boolean editFlg = false;
  Boolean finFlg = false;
  String myline = "";
  String mykey = "";
  String myval = "";
  String line = "";
  String key = "";
  String val = "";
  for (int i = 0; i < iniline.size(); i++) {
   line = iniline.get(i);

   // 完了してたら最後までまわす。
   if (finFlg) {
    retlines.add(line);
    continue;
   }

   // NAME待ち
   String[] str = line.split("=");
   if (str.length <= 1 || "".equals(str[0].trim())) {
    // 対象外はそのまま格納
    retlines.add(line);
    continue;
   }

   // 置換場所策定
   if (confName && "NAME".equals(str[0].trim())) {
    retlines.add(line);
    if (str[1].trim().equals(target)) {
     editFlg = true;
     continue;
    }
    if (editFlg) {
     finFlg = true;
     continue;
    }
   } else if (!confName) {
    editFlg = true;
   }

   // 必要に応じて置換
   if (editFlg) {
    key = str[0].trim();
    val = str[1].trim();
    Boolean add = false;
    for (int j = 1; j < myconftmp.size(); j++) {
     myline = myconftmp.get(j);
     mykey = myline.split("=")[0];
     myval = myline.split("=")[1];
     if (key.equals(mykey) && !val.equals(myval)) {
      retlines.add(mykey + "=" + myval);
      add = true;
      if (confName) {
       isEditInputIni = true;
      } else {
       isEditGlobalIni = true;
      }
      continue;
     }
    }
    if (!add) {
     retlines.add(line);
    }
   }
  }
  return retlines;
 }

 /**
  * 自分の設定情報を取得する。
  *
  * @return
  */
 private static ArrayList<ArrayList<String>> getMyConf(String encode) {
  String myconf = "";
  ArrayList<String> tcf = null;
  ArrayList<ArrayList<String>> mcf = null;
  try {
   BufferedReader fin = new BufferedReader(new InputStreamReader(
     new FileInputStream("myconf.ini"), encode));
   String line;
   while ((line = fin.readLine()) != null) {
    String[] str = line.split("=");
    if (str.length < 1 || "".equals(str[0].trim())
      || str[0].substring(0, 1).equals("#")) {
     continue;
    }

    if (MYCONF.equals(str[0].trim())) {
     if ("".equals(str[1].trim())) {
      continue;
     }
     if (!myconf.equals(str[1].trim())) {
      if (mcf == null || mcf.size() <= 0) {
       mcf = new ArrayList<ArrayList<String>>();
      }
      if (!"".equals(myconf)) {
       mcf.add(tcf);
      }

     }
     tcf = new ArrayList<String>();
     myconf = str[1].trim();
    }

    if (!"".equals(myconf)) {
     tcf.add(str[0].trim() + "=" + str[1].trim());
    }

   }
  } catch (IOException e) {
   System.err.println("Cannot access.");
  }
  mcf.add(tcf);
  return mcf;
 }

 /**
  * FEZのインストールディレクトリパスを取得する
  *
  * @return string FEZのインストールディレクトリ
  */
 private static String getInstallDirectory() {
  Registry reg = new Registry(Registry.HKEY_LOCAL_MACHINE, REG_DIR);
  return reg.getStringValue(REG_NAME);
 }

 /**
  * FEZを起動
  */
 private static void execFez() {
  ArrayList<String> fezExeCmd = new ArrayList<String>();
  fezExeCmd.add("cd " + getInstallDirectory());
  fezExeCmd.add("start " + FEZ_EXE);
  execCmd(fezExeCmd);
 }

 /**
  * コマンドを処理配列順に処理
  *
  * @param cmd
  */
 private static void execCmd(ArrayList<String> cmd) {
  cmd.add("exit");
  Process proc = null;
  try {
   proc = Runtime.getRuntime().exec("cmd");
   if (proc != null) {
    BufferedReader in = new BufferedReader(new InputStreamReader(
      proc.getInputStream()));
    PrintWriter out = new PrintWriter(new BufferedWriter(
      new OutputStreamWriter(proc.getOutputStream())), true);

    for (int i = 0; i < cmd.size(); i++) {
     out.println(cmd.get(i));
    }
    try {
     String line;
     while ((line = in.readLine()) != null) {
      System.out.println(line);
     }
     proc.waitFor();
     in.close();
     out.close();
     proc.destroy();
    } catch (InterruptedException e) {
     e.printStackTrace();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  } catch (Win32Exception e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}