輕量級配置檔常採用 INI 格式(key=value;)。本文提供一個純 Java 實作的 IniFile 類別,支援讀取、寫入(新增/更新)、刪除參數,自動處理檔案不存在、空值等邊界情況,適合中小型專案快速整合。
public class IniFile {
private String fileName;
public IniFile(String fn) { this.fileName = fn; }
public String readPara(String para, String defaultValue);
public boolean writePara(String name, String value);
public boolean delPara(String name);
}
readPara= 分割鍵值,以 ; 結束值NullPointerException 判斷檔案結尾writeParaString AllLinesisHere=false 於末尾追加delPara// 參數(文本文件)的讀寫, by chillming
import java.io.*;
public class IniFile {
private String FileName = "";
public IniFile(String fn) { FileName = fn; }
// 返回參數的值
public String ReadPara(String Para, String PV) {
String PName = "", PValue = PV, LineStr = "";
int pos = 0;
try {
BufferedReader RFile = new BufferedReader(new FileReader(FileName));
while (true) {
try {
LineStr = RFile.readLine();
pos = LineStr.indexOf("=");
PName = LineStr.substring(0, pos).trim();
if (PName.equals(Para.trim())) {
PValue = LineStr.substring(pos + 1, LineStr.indexOf(";")).trim();
break;
}
} catch (NullPointerException e) { break; }
}
RFile.close();
} catch (IOException e) {
if (PV == null) PV = "";
return PV;
}
return PValue;
}
// 更新或添加參數
public boolean WritePara(String PN, String PV) {
String PName = "", PValue = "", LineStr = "", AllLines = "";
int pos = 0;
boolean isHere = false;
if (PV == null) PV = "";
try {
BufferedReader RFile = null;
try {
RFile = new BufferedReader(new FileReader(FileName));
} catch (FileNotFoundException e) {
File file = new File(FileName);
file.createNewFile();
RFile = new BufferedReader(new FileReader(FileName));
}
while (true) {
try {
LineStr = RFile.readLine();
pos = LineStr.indexOf("=");
PName = LineStr.substring(0, pos).trim();
PValue = LineStr.substring(pos + 1, LineStr.indexOf(";")).trim();
if (PName.equals(PN)) {
LineStr = PName + "=" + PV + ";\n";
isHere = true;
} else {
LineStr = PName + "=" + PValue + ";\n";
}
if (LineStr != null && LineStr != "") AllLines += LineStr;
} catch (NullPointerException e) { break; }
}
RFile.close();
} catch (IOException e) { return false; }
try {
BufferedWriter Fout = new BufferedWriter(new FileWriter(FileName));
if (!isHere) {
LineStr = PN + "=" + PV + ";\n";
AllLines += LineStr;
}
Fout.write(AllLines);
Fout.close();
} catch (IOException e) {
System.out.println("io error write");
return false;
}
return true;
}
// 刪除參數
public boolean DelPara(String PN) {
String PName = "", LineStr = "", AllLines = "";
int pos = 0;
try {
BufferedReader RFile = new BufferedReader(new FileReader(FileName));
while (true) {
try {
LineStr = RFile.readLine();
pos = LineStr.indexOf("=");
PName = LineStr.substring(0, pos).trim();
if (!PName.equals(PN)) AllLines += LineStr + "\n";
} catch (NullPointerException e) { break; }
}
RFile.close();
} catch (IOException e) { return false; }
try {
BufferedWriter Fout = new BufferedWriter(new FileWriter(FileName));
Fout.write(AllLines);
Fout.close();
} catch (IOException e) { return false; }
return true;
}
public static void main(String args[]) {
String fn = "Config.txt";
String Pv = "";
IniFile inifile = new IniFile(fn);
inifile.WritePara("java", "chillming");
inifile.WritePara("java1", "chillming1");
inifile.WritePara("java2", "chillming2");
inifile.DelPara("java1");
Pv = inifile.ReadPara("java2", "java2");
System.out.println(Pv);
Pv = inifile.ReadPara("java1", "java1");
System.out.println(Pv);
Pv = inifile.ReadPara("java", "java0");
System.out.println(Pv);
}
}
IniFile ini = new IniFile("config.ini");
// 寫入
ini.WritePara("db.url", "jdbc:mysql://localhost:3306/mydb");
ini.WritePara("db.user", "root");
// 讀取
String url = ini.ReadPara("db.url", "default_url");
// 刪除
ini.DelPara("db.user");
| 優點 | 缺點/改進 |
|---|---|
| 零依賴、輕量、API 直觀 | 全量讀寫不適合大檔案;建議改用 Properties 或第三方庫(如 Apache Commons Configuration) |
| 自動建檔、空值處理 | 未支援 Section 區塊;格式固定為 key=value;,擴充性有限 |
| 適合簡單配置場景 | 並發安全性未處理;多執行緒環境需外部同步 |