使用dbf-lib对dbf文件进行读写

匿名 (未验证) 提交于 2019-12-02 23:38:02

https://github.com/DANS-KNAW/dans-dbf-lib。将工程打成jar包就可以调用了。

对于读写dbf,首先要创建一个Table对象。其次需要执行open()方法,否则调用其读写操作都会抛出异常。调用完后需要调用close()方法,不然资源将一直处于被占用状态。这和输入输出流的使用是一样的。

1.读dbf文件记录:

首先调用table构造方法创建Table对象(最好指定编码格式,因为如果dbf文件中存储的有中文很有可能乱码)。

open()方法有两个重载方法,无参默认为只读访问模式(这里指RandomAccessFile的权限)且文件不存在就报错。

getRecordsAt方法和getAllRecords方法都是获取记录,前者是从指定行数获取记录,后者是获取所有记录,即从0行开始获取记录。

然后调用close()关闭资源。关于Table中的方法可查看相关源码。

 /** 	 * 获取记录 	 * @param dbfFile 	 * @param index开始位置 	 * @param count获取数据条数 	 * @param charsetName 	 * @return 	 * @throws CorruptedTableException 	 * @throws IOException 	 */ 	public static List<Map<String, String>> getRecords(File dbfFile, int index, int count, String charsetName)  			throws CorruptedTableException, IOException {  		List<Map<String, String>> getRecordsList = new ArrayList(); //		File dbfFile = new File(path); 		Table table = new Table(dbfFile, charsetName); 		table.open(IfNonExistent.ERROR); 		Date nowLastModifiedDate = table.getLastModifiedDate(); 		List<Field> fields = table.getFields(); 		List<Record> records = table.getRecordsAt(index, count); 		records.stream().forEach(record -> { 			Map<String, String> recordMap = new HashMap(); 			fields.forEach(field -> { 				recordMap.put(field.getName(), StringUtils.trimToNull(record.getStringValue(field.getName()))); 			}); 			getRecordsList.add(recordMap); 		}); 		table.close(); 		return getRecordsList; 	}

2.写记录到dbf文件

 /** 	 * 添加数据 	 * @param path 	 * @param recordList记录 	 * @throws CorruptedTableException 	 * @throws IOException 	 */ 	public static void addRecords(String path, List<Map<String, String>> recordList, String charsetName) 			throws CorruptedTableException, IOException { 		File dbfFile = new File(path); 		Table table = new Table(dbfFile, charsetName); 		table.open(IfNonExistent.ERROR); 		recordList.stream().forEach(map -> { 			Map<String, Value> rocordMap = new HashMap<>(); 			map.forEach((key, value) -> { 				rocordMap.put(key, new StringValue(value, charsetName)); 			}); 			System.out.println(rocordMap); 			try { 				table.addRecord(new Record(rocordMap)); 			} catch (IOException | DbfLibException e) { 				e.printStackTrace(); 			} 		}); 		table.close(); 	}

3.创建dbf文件

创建dbf需要指定Field,而每一个Field要指定name,type和length

 public static void creatDbf(String path, List<Map<String, String>> fieldMapList, String charsetName)  			throws IOException, CorruptedTableException, InvalidFieldTypeException, InvalidFieldLengthException { 		List<Field> fieldList = new ArrayList<>(); 		fieldMapList.stream().forEach(fieldMap -> { 			fieldList.add(new Field(fieldMap.get("name"), Type.CHARACTER,  					Integer.parseInt(fieldMap.get("length")))); 		}); 		 		File dbfFile = new File(path); 		Table table = new Table(dbfFile, Version.CLIPPER_5, fieldList, charsetName); 		table.open(IfNonExistent.CREATE); 		table.close(); 	}

文章来源: https://blog.csdn.net/u010689849/article/details/91310914
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!