依賴引入
<dependency>
<groupId>net.sf.javadbf</groupId>
<artifactId>javadbf</artifactId>
<version>0.4.0</version> <!-- 請依實際版本調整 -->
</dependency>
讀取 DBF
import com.linuxense.javadbf.*;
public static void readDBF(String path) {
try (InputStream fis = new FileInputStream(path);
DBFReader reader = new DBFReader(fis)) {
int fieldCount = reader.getFieldCount();
System.out.println("欄位數: " + fieldCount);
// 列印欄位定義
for (int i = 0; i < fieldCount; i++) {
DBFField field = reader.getField(i);
System.out.printf(" [%d] %s %s(%d)%n", i, field.getName(),
field.getDataType(), field.getFieldLength());
}
// 逐筆讀取
Object[] row;
while ((row = reader.nextRecord()) != null) {
for (Object val : row) System.out.print(val + "\t");
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
寫入 DBF
public static void writeDBF(String path) {
try (OutputStream fos = new FileOutputStream(path)) {
// 1. 定義欄位
DBFField[] fields = new DBFField[3];
fields[0] = new DBFField(); fields[0].setName("EMP_CODE"); fields[0].setDataType(DBFField.FIELD_TYPE_C); fields[0].setFieldLength(10);
fields[1] = new DBFField(); fields[1].setName("EMP_NAME"); fields[1].setDataType(DBFField.FIELD_TYPE_C); fields[1].setFieldLength(20);
fields[2] = new DBFField(); fields[2].setName("SALARY"); fields[2].setDataType(DBFField.FIELD_TYPE_N); fields[2].setFieldLength(12); fields[2].setDecimalCount(2);
// 2. 寫入資料
DBFWriter writer = new DBFWriter();
writer.setFields(fields);
writer.addRecord(new Object[]{"1000", "John", 5000.00});
writer.addRecord(new Object[]{"1001", "Lalit", 3400.00});
writer.addRecord(new Object[]{"1002", "Rohit", 7350.00});
writer.write(fos);
System.out.println("DBF 寫入完成: " + path);
} catch (Exception e) {
e.printStackTrace();
}
}
進階:複製並新增欄位
public static void copyAndAddFields(String src, String dest) {
try (InputStream fis = new FileInputStream(src);
DBFReader reader = new DBFReader(fis);
OutputStream fos = new FileOutputStream(dest)) {
int n = reader.getFieldCount();
DBFField[] newFields = Arrays.copyOf(reader.getFields(), n + 2);
newFields[n] = newField("ADD1", DBFField.FIELD_TYPE_C, 10);
newFields[n+1] = newField("ADD2", DBFField.FIELD_TYPE_C, 10);
DBFWriter writer = new DBFWriter();
writer.setFields(newFields);
Object[] row;
while ((row = reader.nextRecord()) != null) {
Object[] newRow = Arrays.copyOf(row, n + 2);
newRow[n] = "x"; newRow[n+1] = "xx";
writer.addRecord(newRow);
}
writer.write(fos);
} catch (Exception e) { e.printStackTrace(); }
}
private static DBFField newField(String name, char type, int len) {
DBFField f = new DBFField(); f.setName(name); f.setDataType(type); f.setFieldLength(len); return f;
}
常見資料型別對照
| DBF 型別 | 常數 | Java 型別 |
| Character | FIELD_TYPE_C | String |
| Numeric | FIELD_TYPE_N | Double / BigDecimal |
| Logical | FIELD_TYPE_L | Boolean |
| Date | FIELD_TYPE_D | java.util.Date |
注意事項
- DBF 檔案編碼預設為系統預設,中文環境常為 CP950/Big5,讀取亂碼時需指定
DBFReader(reader, "CP950") 建構子(視版本支援)。
- 大檔案請使用
try-with-resources 確保流關閉。
- Numeric 欄位寫入建議用
BigDecimal 避免浮點誤差。