[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();
}
}
}
--------------------------------------------
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();
}
}
}