首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 解析 DBF 檔案:使用 javadbf 函式庫讀寫完整範例

     編輯:Java 相關知識

依賴引入


<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 型別
CharacterFIELD_TYPE_CString
NumericFIELD_TYPE_NDouble / BigDecimal
LogicalFIELD_TYPE_LBoolean
DateFIELD_TYPE_Djava.util.Date

注意事項

  • DBF 檔案編碼預設為系統預設,中文環境常為 CP950/Big5,讀取亂碼時需指定 DBFReader(reader, "CP950") 建構子(視版本支援)。
  • 大檔案請使用 try-with-resources 確保流關閉。
  • Numeric 欄位寫入建議用 BigDecimal 避免浮點誤差。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved