使用rest接口导入shp文件时出错,
java.io.ioexception: current fid index is null, next must be called before write(),
网上找了一下,找到了一篇文章,地址http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9A%84/14090.shtml

自己又仔细研究了一下出错的地方的源码,先贴一下在讲原因

org.geotools.data.shapefile.dbf.DbaseFileWriterpublic String getFieldString(int size, String s) {try {buffer.replace(0, size, emptyString);buffer.setLength(size);// international characters must be accounted for so size != length.int maxSize = size;if (s != null) {buffer.replace(0, size, s);int currentBytes =s.substring(0, Math.min(size, s.length())).getBytes(charset.name()).length;if (currentBytes > size) {char[] c = new char[1];for (int index = size - 1; currentBytes > size; index--) {c[0] = buffer.charAt(index);String string = new String(c);buffer.deleteCharAt(index);currentBytes -= string.getBytes().length;maxSize--;}} else {if (s.length() < size) {maxSize = size - (currentBytes - s.length());for (int i = s.length(); i < size; i++) {buffer.append(' ');}}}}buffer.setLength(maxSize);return buffer.toString();} catch (UnsupportedEncodingException e) {throw new RuntimeException("This error should never occurr", e);}}

以下是个人分析,可能有不对的地方,见谅:
主要原因是有中文字符引起的
dbf文件中是按字节存储的,而一个汉字,GBK是2个字节,UTF-8是三个字节,StringBuffer 里的charAt是按字符算的,geoserver rest上传文件的过程,不是直接按字节保存的,而是读取shape的全部内容,包括dbf,然后再写入到一个新的shape文件中。

如果遇到String类型的属性,会调用 getFieldString(int size,String s)方法,截取掉多余的字节,下面举一个真实的例子,size 20,s是"福建省福州市罗源县",UTF-8编码转换为字节是27,27大于字段长度20,需要截取出前20个字符来。
但是方法内部是用的从末尾删除的方法,具体看下面图片。

大家可以仔细研究一下代码,总结一下:
如果是UTF-8编码,则字段长度必须设计为value长度的3倍
如果是GBK边框,则字段长度必须设计为value长度的2倍
,否则的话如果存储的中文字段getBytes之后超过字段的length,则会报错。

java.lang.StringIndexOutOfBoundsException: String index out of range: 19

不知道修改下代码,强行把多余的字符写入到dbf文件中是否会报错,因为这个本来就是存储在dbf文件中的,但是是从其他软件中导出的,不是用geotools生成的。

如果哪位大神知道,请留言解释一下。

自己想了个解决方案
在调用rest接口之前,把dbf文件重写一遍,定义字段的时候,字段长度定义为原来的3倍,这样geoserver在遇见中文的时候就不会报错了。

贴一下简单的代码

<dependency><groupId>com.github.albfernandez</groupId><artifactId>javadbf</artifactId><version>1.9.2</version></dependency>
public static void changeStringLength(String dbfName, String dbfCharest, String ndbfName,String newCharset)throws Exception {try (DBFReader reader = new DBFReader(new FileInputStream(dbfName), Charset.forName(dbfCharest));DBFWriter writer = new DBFWriter(new FileOutputStream(ndbfName),Charset.forName(newCharset))) {int numberOfFields = reader.getFieldCount();//改变字符串字段的长度List<DBFField> fields = Lists.newArrayList();for (int i = 0; i < numberOfFields; i++) {DBFField field = reader.getField(i);//处理字段字符串字段  乘以3,为了适应UTF8是3个字节的问题if (field.getType().equals(DBFDataType.CHARACTER) || field.getType().equals(DBFDataType.VARCHAR)) {int maxLength = field.getLength() * 3;if (maxLength > field.getType().getMaxSize()) {maxLength = field.getType().getMaxSize();}field.setLength(maxLength);}fields.add(field);}//设置新文件的头writer.setFields(fields.toArray(new DBFField[fields.size()]));Object[] rowObjects;while ((rowObjects = reader.nextRecord()) != null) {writer.addRecord(rowObjects);}}}

通过以上方案暂时解决了中文字符过长的问题,但是不知道会不会触发其他的bug。

转载于:https://blog.51cto.com/luhaiyou/2357647

geoserver rest 导入shape文件错误相关推荐

  1. Navicat for MySQL 导入SQL文件错误

    原文出自:Navicat for MySQL 导入SQL文件错误_xgbnapsua的博客-CSDN博客_navicat导入sql文件错误 !!!!一定一定要新建一个与导入文件名字相同,编码格式一致的 ...

  2. 导入shape文件到SDE数据库

    /** * pDataSet:要导出的数据库的数据集,如果直接导入到数据库而不是数据集,则使用强制转换IWorkspace-->IDataset * strFeatFileDir:要导入的sha ...

  3. 导入mysql 1044_MySQL导入sql文件错误#1044

    换了台新的笔记本,原来的mysql被我dump成一个sql文件,50多M.结果在新系统里面导入的时候出现问题,在命令行执行source的时候报 在我的个人知识管理中,经常用到mysql数据库,word ...

  4. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件

    导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件 参考文章: (1)导入数据任务(id:373985)异常, 错误信 ...

  5. 使用命令导入sql文件到mysql数据库时报Failed to open file错误的解决方案

    使用命令导入sql文件到mysql数据库时报Failed to open file错误的解决方案 参考文章: (1)使用命令导入sql文件到mysql数据库时报Failed to open file错 ...

  6. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...

    小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...

  7. mysql无法打开excel_关于Navicat将Excel数据导入到MySQL中出现无法打开文件错误

    一.起因:关于Navicat将Excel中的数据导入到数据库中,出现无法打开文件问题 最近想通过navicat ,将excel文件(xlsx格式)导入到数据库中,按照导入向导一步步操作,出现无法打开文 ...

  8. imp 00017 由于 oracle 错误 6550,imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 20005 求大神!...

    当前位置:我的异常网» Oracle管理 » imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 2 ...

  9. php错误1064,求助,phpmyadmin导入sql文件提示1064错误

    求助,phpmyadmin导入sql文件提示1064错误 -- phpMyAdmin SQL Dump -- version 4.6.4 -- https://www. -- -- Host: 127 ...

最新文章

  1. 使用python抓取百度漂流瓶妹纸照片
  2. js中JSON.stringify用于自定义的类
  3. 把握不好数组边界的危害(记洛谷P1789题RE+WA的经历,Java语言描述)
  4. excel制作一个信息录入系统_制作Excel仓库入库单,一键完成数据录入、计算及保存操作...
  5. Web API路由与动作(三)
  6. 卸载 vista sp1
  7. 大海为什么是蓝色的?
  8. echarts:柱状图去掉网格线
  9. 彻底删除GitHub仓库的某个文件或文件夹及其历史记录
  10. 梭杆菌(Fusobacterium)——共生菌,机会菌,癌杆菌
  11. C# 中where关键字详解
  12. 创建springboot多模块项目(下)
  13. win7下怎么配置ODBC数据源
  14. 计算机一级msoffice考试操作题教程,2014年计算机一级考试MSOffice第三章考点解析 10...
  15. 【贵阳市公积金相关问题】
  16. 本以为PlusFo是个青铜,没想到竟是个王者
  17. 【Spring】(1)Spring概述:什么是Spring框架?为什么要用Spring框架?
  18. java校园一卡通管理系统
  19. win10便捷工具--Chrome插件推荐
  20. python切片-截取-逆序截取

热门文章

  1. Elementui 自定义loading
  2. 【jQuery笔记】新浪微博案例笔记
  3. css3弹性盒子、媒体查询、多列布局
  4. Python_生成器Generator
  5. 基于顺序存储结构的图书信息表的最佳位置图书的查找(C++)
  6. 字符串匹配:字符串中查找某子串
  7. stft isar成像 matlab,基于STFT和FRFT的运动目标雷达三维成像方法与流程
  8. 如何修改GitHub项目显示语言问题
  9. jmeter html 乱码,JMeter3.0图形化HTML报告中文乱码问题处理
  10. \pset 、\x命令