最近在开发中使用了Iterator遍历,一开始没有养成释放资源的习惯。直到踩坑,上代码
public static void addDataWithNewField(SimpleFeatureType newType, Geometry geometry, Map fieldValueMap , Map newFields) throws IOException {
String typeName = newType.getTypeName();
// 更新模式
FeatureStore featureStore = (FeatureStore) dataStore.getFeatureSource(typeName);
SimpleFeatureCollection collection = (SimpleFeatureCollection) featureStore.getFeatures();
SimpleFeatureCollection copyCollection = copyFeatures(newType, collection, newFields);
// 这里还存在引用所以不可能删除掉,会卡死
dataStore.removeSchema(typeName);
dataStore.createSchema(newType);
featureStore = (FeatureStore)dataStore.getFeatureSource(typeName);
featureStore.addFeatures(copyCollection);
//追加要素
appendFeature(newType, geometry, fieldValueMap);
}
public static SimpleFeatureCollection copyFeatures(SimpleFeatureType newType, SimpleFeatureCollection collection, Map newFields) {
SimpleFeatureIterator iterator = collection.features();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(newType);
List<SimpleFeature> copyFeatures = new ArrayList<>();
while (iterator.hasNext()) {
SimpleFeature simpleFeature = iterator.next();
Collection<Property> properties = simpleFeature.getProperties();
Iterator<Property> propertyIterator = properties.iterator();
while (propertyIterator.hasNext()) {
Property property = propertyIterator.next();
builder.set(property.getName(), property.getValue());
}
Set set = newFields.keySet();
Iterator iterator1 = set.iterator();
while (iterator1.hasNext()) {
String key = (String) iterator1.next();
builder.set(key, newFields.get(key));
}
SimpleFeature copyFeature = builder.buildFeature(null);
copyFeatures.add(copyFeature);
}
// 这个资源一定要记得关闭
iterator.close();
return new ListFeatureCollection(newType, copyFeatures);
}
在这段代码中dataStore是连接数据库获取空间表资源,一开始没有释放iterator删除操作卡死不动,释放后顺利执行后面的代码。特此记录一下,以后一定要养成释放不用的资源的好习惯。