JAVA解析DBF文件方案
bdf文件语句解析
bdf文件语句解析bdf文件是一种字库文件格式,用于存储字形数据和字符编码信息。
它是一种二进制文件,通常用于嵌入式系统和字库管理软件中。
下面是对bdf文件语句进行解析的内容。
1. BDF文件是Bitmap Distribution Format(位图分布格式)的缩写,它是一种用于存储字形数据和字符编码信息的文件格式。
2. BDF文件中的每个字符都由一个位图表示,位图的每个像素代表一个像素点的状态,可以表示字符的形状。
3. BDF文件由一系列的属性和字符定义组成,属性包括字体名称、字体大小、字符集等信息。
4. BDF文件使用ASCII码表示字符编码,每个字符定义都包含字符的编码和对应的位图数据。
5. BDF文件中的字符定义按照编码的顺序排列,可以根据编码来查找对应的字符。
6. BDF文件中的字符定义可以包含字符的宽度、高度、基线位置等信息,这些信息可以用来在屏幕上正确显示字符。
7. BDF文件中的位图数据通常以二进制形式存储,每个像素点的状态用一个位来表示,1表示点亮,0表示不点亮。
8. BDF文件中的字符定义可以包含字符的笔画数、笔画序列等信息,这些信息可以用来生成字形轮廓。
9. BDF文件可以通过字库管理软件来创建和编辑,也可以通过转换工具将其他字库格式转换为BDF格式。
10. BDF文件可以被嵌入式系统使用,通过加载BDF文件中的字符数据,系统可以根据字符编码来显示对应的字符。
11. BDF文件可以被字体渲染引擎使用,通过解析BDF文件中的字符定义和位图数据,引擎可以将字符渲染到屏幕上。
12. BDF文件可以包含多种字号的字符定义,可以根据需要选择适合的字号来显示字符。
13. BDF文件的大小通常取决于字符集的大小和每个字符的位图数据大小,可以通过压缩算法来减小文件的大小。
14. BDF文件可以包含不同的字符集,可以根据需要选择适合的字符集来显示字符。
15. BDF文件可以通过字库管理软件进行导入和导出,可以方便地与其他字库格式进行转换和兼容。
bdf 格式解析 -回复
bdf 格式解析-回复什么是BDF格式?BDF格式是一种用于字体文件的文件格式,其全称为Glyph Bitmap Distribution Format。
它保存了字体中每个字符的位图信息以及其他相关的元数据。
BDF格式最初由Adobe Systems开发,后来成为了X Window 系统的一部分,并被广泛应用于Unix和Linux平台上。
BDF格式的文件结构是怎样的?BDF文件的结构比较简单,它由一系列的标签和值对组成。
文件的开头通常包含元数据信息,如文件版本、作者、版权等。
之后是描述每个字符的位图信息的部分。
每个字符的位图由一系列的0和1表示,这些0和1对应于字符的草图形状。
在位图信息之后,可以包含其他的元数据信息,如字符的宽度、高度、偏移值等。
整个文件由ASCII字符组成,可以使用文本编辑器进行查看和编辑。
如何解析BDF格式?解析BDF格式文件可以通过以下几个步骤进行。
首先,打开目标BDF格式文件,并使用文本编辑器进行查看。
可以看到文件开头的元数据信息,如版本号、作者等。
其次,通过查找特定标签,如"STARTCHAR"和"BITMAP",可以找到每个字符的位图数据。
根据BDF文件的结构,每个字符的位图信息通常位于"BITMAP"标签后面,可以通过查找相邻字符之间的差异来定位每个字符的具体位置。
接下来,根据位图信息所在的行数和列数,可以将位图数据转换为二维数组或其他合适的数据结构表示。
最后,可以使用该数据结构加载和显示字体中的字符。
BDF格式有哪些应用领域?BDF格式由于其简单明了的文件结构,被广泛应用于Unix和Linux系统中的字体管理和渲染。
特别是在命令行界面下,BDF格式的字体文件可以提供基本的字符显示功能。
此外,BDF格式也可以用于字体编辑和设计,用户可以通过编辑BDF文件中的位图数据来调整和修改字符的外形。
从字体开发者的角度来看,BDF格式提供了一种便捷的方式来创建和管理字体库。
java+ingest-attachment实现文档解析
java+ingest-attachment实现文档解析Java+ingest-attachment实现文档解析在当今信息爆炸的时代,大量的文档需要被解析和处理。
为了提高效率和准确性,开发人员通过使用Java编程语言结合ingest-attachment 插件来实现文档解析是一种常见的做法。
一、什么是ingest-attachment插件?ingest-attachment插件是一种Elasticsearch中允许我们对二进制文件(如PDF、Word文档、图片等)进行自动处理和解析的插件。
它基于Apache Tika,一个开源的文档内容解析库。
二、使用Java集成ingest-attachment插件1. 添加ingest-attachment依赖首先,在你的Java项目的pom.xml文件中添加ingest-attachment的依赖:```xml<dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>ingest-attachment</artifactId><version>7.15.1</version></dependency>```2. 创建索引和映射在使用ingest-attachment插件进行文档解析之前,我们需要先创建索引和映射。
假设我们要解析的文档存储在一个名为"documents"的索引中,具体的映射设置如下:```javaCreateIndexRequest request = new CreateIndexRequest("documents");request.settings(Settings.builder().put("index.number_of_shards", 1).put("index.number_of_replicas", 0));request.mapping("properties", "{\n" +" \"my_attachment\": {\n" +" \"type\": \"attachment\",\n" +" \"fields\": {\n" +" \"content\": {\n" +" \"type\": \"text\"\n" +" }\n" +" }\n" +" }\n" +"}", XContentType.JSON);CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);```上述代码通过Elasticsearch的Java High Level REST Client创建了一个名为"documents"的索引,使用了ingest-attachment插件,并设置了相应的映射。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案。。。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案及开发中的点滴分享 在此,先分享下写此⽂前的经历与感受,我所有的感觉浓缩到⼀个字,那就是:"坑",如果是两个字那就是"巨坑"=>因为这个需求⼀开始并不是这样⼦的,且听我漫漫道来: ⼀开始客户与我们商量的是将office和PDF上传,将此类⽂件解析成html格式,在APP端调⽤内置server直接以html"播放" 经历⼀个⽉~,两个⽉~,三个⽉~~~ 到需求开发阶段,发现这是个坑。
:按照需规的意思这个整体是当做⼀个功能来做的,技术难度也就算了,⽽且按照估算的⼯时也很难做成需规所需要的样⼦(缺陷太多!) 然后⼀周~,⼀周~,⼜⼀周~~~ 各种⽅案下来将需求做成能⽤的样⼦,然后需求确认时客户说:“我们没有要求你们能解析这些⽂档,我们只要求你们当做⼀个源⽂件上传,在APP端点击直接能选择调⽤第三⽅应⽤打开就⾏了,⽽且⼀开始我们的需求就是这样的。
” /**听完,顿时泪流满⾯( _ ),如果业务⼀开始就确认这样做,何⾄于浪费如此多的时间,花费如此多的精⼒绕⽼⼤⼀圈。
*/ 需求绕了⼀圈⼜绕回来了,作为经历过的⼈,现在总结下这需求⾥⾯⽆尽的坑: A>开源社区有很多Demo,这些Demo有很多缺陷,⽐如office⾥⾯的艺术字、图⽚、公式、颜⾊样式、视频和⾳频不能解析 B>能解析的对象,解析出来的效果不是很好,⽐如word和ppt⾃⾝的排版乱了,excel单元格⾥⾯的⾃定义格式全变成数字了~等等 C>开源社区的资料并不是很全,导致的结果是不同的⽂档类型需要⽤不同的解析⽅式去解析,⽐如word⽤docx4j解析、excel⽤poi解析带来的代码量巨⼤ D>由于代码⾃⾝的解析效果不是很好,更改后的⽅案需要在上传之前将源⽂件处理成其他的形式,如pdf需要切成图⽚,ppt需要转换成视频或是图⽚,这样⼀来需求实现的⽅式就变成半⾃动了╥﹏╥... E>word⽤docx4j解析⼀个很⼤的问题是解析的效率太低了,5MB以上的⽂件或者内容⽐较复杂的word⽂档解析⼗分耗时,解析效率太低,再⼀就是poi解析数据量⽐较⼤的Exel(⽐如>1000⾏)容易造成内存溢出,不好控制 F>⼯时太短,只有15天。
java bin码解析
java bin码解析Java bin码解析指的是将数据从二进制格式转换为Java对象的过程。
在Java中,使用ObjectInputStream类读取二进制数据,并将其转换为Java对象。
下面我们来详细了解一下Java bin码解析的过程。
Java bin码解析的过程包括以下步骤:1.创建输入流在Java中,可以使用FileInputStream或ByteArrayInputStream来创建输入流。
一般情况下,我们会从文件或网络中读取二进制数据,因此使用FileInputStream来创建输入流。
2.创建对象输入流在Java中,使用ObjectInputStream类来读取二进制数据。
因此,我们需要在创建输入流之后,使用ObjectInputStream类将其封装为对象输入流。
3.读取对象当我们创建好对象输入流之后,就可以使用其提供的readObject()方法来读取对象。
该方法会从输入流中读取二进制数据,并将其转换为Java对象。
4.关闭输入流读取完对象之后,我们需要关闭输入流,以释放系统资源。
以上便是Java bin码解析的过程,其代码实现如下:import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;public class BinaryDecoder {public static Object decode(String fileName) throws IOException, ClassNotFoundException {Object result = null;FileInputStream fis = null;ObjectInputStream ois = null;try {fis = new FileInputStream(fileName);ois = new ObjectInputStream(fis);result = ois.readObject();} finally {if (ois != null) {ois.close();}if (fis != null) {fis.close();}}return result;}}在上述代码中,我们封装了一个decode()方法,该方法接收一个文件名作为参数,并返回解析后的Java对象。
java iinarchive.extract 方法解析
java iinarchive.extract 方法解析一、概述在Java中,`inarchive.extract`方法用于从归档文件中提取文件。
归档文件是一种包含多个文件的压缩文件,常见的归档格式包括ZIP、TAR等。
`inarchive.extract`方法提供了一种方便的方式来解压缩归档文件,从而可以方便地访问其中的文件。
二、方法解析1. 语法结构`inarchive.extract(String archivePath, String destinationDir)`* `archivePath`:归档文件的路径,可以是绝对路径或相对路径。
* `destinationDir`:提取文件的目录路径。
例如:`inarchive.extract("C:/archive.zip","C:/extractedFolder")`2. 参数说明* `archivePath`:必填参数,指定要解压缩的归档文件的路径。
可以是相对路径或绝对路径,如果提供了相对路径,则归档文件相对于当前工作目录进行解压缩。
* `destinationDir`:可选参数,指定提取文件的目录路径。
如果不提供该参数,则默认在当前工作目录下创建一个名为“extracted”的目录进行提取。
3. 返回值该方法没有返回值(void)。
4. 异常处理在调用`inarchive.extract`方法时,可能会抛出异常,如文件找不到异常(FileNotFoundException)、权限不足异常(PermissionDeniedException)等。
因此,需要做好异常处理,确保在解压缩过程中能够正确处理各种可能出现的错误情况。
三、使用示例下面是一个简单的使用示例:```javaimport inarchive.*;public class ArchiveExtractor {public static void main(String[] args) {String archivePath = "C:/archive.zip";String destinationDir = "C:/extractedFolder";try {inarchive.extract(archivePath, destinationDir);System.out.println("Archive extraction completed successfully.");} catch (Exception e) {System.err.println("Error during archive extraction: " + e.getMessage());}}}```四、注意事项* 在解压缩过程中,需要确保有足够的权限访问归档文件和目标目录。
JAVA平台下的DXF文件解析库的设计与实现
The Design and Implementation of DXF Parsing LibraryBased on JA V AA Dissertation Submitted for the Degree of MasterCandidate:Liang JingyaSupervisor:Prof. Wu YiminSouth China University of TechnologyGuangzhou, China摘要作为行业的主导产品,AutoCAD的应用相当广泛。
然而,其针对解决具体行业或者具体项目的功能,不足以满足不同领域用户的特殊需求。
因此,借助AutoCAD的接口进行定制开发具有重要意义。
目前JA V A平台和AutoCAD系统之间的连接存在各种问题,要么以牺牲平台优势为基础,通过JNI调用COM组件或者其他语言,要么自身平台对AutoCAD的图形数据交换文件的解析库并不完善。
在这种背景下,本文立足于JA V A语言去解析DXF文件,准确获取各种图元属性以及非图元数据,为AutoCAD与其他系统之间的连接提供一个通用的解析库。
文章主要从以下几个方面进行研究:首先,对DXF文件存储格式进行分析,讨论了各段的结构和内容;其次,结合对AutoCAD图形数据库整体的讲解,进行相关的数据结构和模块设计,还有坐标系转换算法的阐述;然后,具体介绍了详细解析流程,其间包括对块结构、词典结构等分析;最后,以实际建筑图纸为测试样本,结合Three.js根据文件解析得到的数据进行模型渲染,匹配原图进而验证解析的完整程度和准确性,同时通过与其他平台的解析库进行性能上的对比,并作出分析。
关键词:DXF;AutoCAD;JA V A;解析AbstractAs a leading product in the industry, AutoCAD is widely used to design. However, the functions of AutoCAD which aim at solving the problems of specific industries and specific items, could not meet the special demands of the users in different fields. Therefore, with the help of AutoCAD interface, it is of great significance to customize the software. So far there are many problems between the Java and AutoCAD. On the one hand, if we use Java native interface to call the component object model or other language, it will lose many advantages of Java platform. On the another hand, there is none perfect DXF parsing library based on Java. In this context, this paper uses Java to parse DXF and offer a common parsing library for connection between AutoCAD and other systems. By this parsing library, every entity or object data you need is searched accurately.Several contents of the study are mentioned as follows: Firstly, the format of DXF is introduced and the structure and content of every section in the DXF are analyzed. Secondly, through the access to AutoCAD database, the data structure and modules in the system are designed. Besides, this paper points out the coordinate conversion method. Thirdly, the processing process of parsing is explained in detail. By reading this paper, you can know about the structure of block, the structure of dictionary and so on. Finally, after getting data from actual construction drawings by this parsing library, we use a library named Three.js to render the model. Contrast to the original image seen in AutoCAD, it will verify the completeness and accuracy. At the same time, we do the performance test between two parsing libraries and make analysis.Keyword: DXF, AutoCAD, Java, parsing目录摘要 (I)Abstract (II)第一章绪论 (1)1.1 研究背景 (1)1.2 研究现状 (2)1.3 研究内容 (3)1.4 研究意义 (4)1.5 本文结构 (5)第二章 DXF文件结构 (7)2.1 DXF整体格式 (7)2.2 HEADER段结构 (9)2.3 CLASSES段结构 (9)2.4 TABLES段结构 (10)2.5 BLOCKS段结构 (12)2.6 ENTITIES段结构 (13)2.7 OBJECTS段结构 (14)2.8 不同版本DXF文件分析 (15)2.9 本章小结 (16)第三章 DXF解析库设计 (17)3.1 整体模块设计 (17)3.2 DXF文件对象结构设计 (18)3.3 实体结构设计 (21)3.4 对象的继承关系设计 (25)3.5 表驱动设计 (26)3.5.1 表驱动法介绍 (26)3.5.2 颜色索引表 (27)3.5.3 图形单位换算 (29)3.6坐标系转换设计 (30)3.6.1 AutoCAD坐标系介绍 (30)3.6.2 任意轴算法 (32)3.7 本章小结 (34)第四章 DXF解析库实现 (35)4.1 整体解析流程 (35)4.2 HEADER段解析 (36)4.3 TABLES段解析 (37)4.4 BLOCKS段解析 (39)4.5 OBJECTS段解析 (41)4.6 本章小结 (42)第五章解析库的应用和测试 (43)5.1 解析库的应用 (43)5.1.1 Three.js介绍 (43)5.1.2 解析库和Three.js的结合 (44)5.2 解析库的测试和对比 (47)5.2.1 性能测试 (47)5.2.2 对比分析 (49)5.3 本章小结 (53)总结与展望 (54)参考文献 (56)攻读硕士学位期间取得的研究成果 (58)致谢 (59)第一章绪论第一章绪论1.1 研究背景计算机辅助设计CAD (Computer Aided Design)是一种通过计算机系统来协助人们进行工程项目设计的方法,其引进替代了传统手工制图的方式,明显改进了绘图的质量和提高设计精度,而且缩短了产品设计开发的周期,在短短的几十年内推动了大部分的工业领域,发展尤其迅速,无疑是一次历史性的改革,应用也日益广泛[1]。
java中poi解析Excel文件版本问题解决办法
java中poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件时有两种格式:HSSFWorkbook格式⽤来解析Excel2003(xls)的⽂件XSSFWorkbook格式⽤来解析Excel2007(xlsx)的⽂件如果⽤HSSFWorkbook解析Excel2007(xlsx)时就会报异常:“The supplied data appears to be in the Office 2007+ XML.You are calling the part of POI that deals with OLE2 Office Documents.You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接⼝,所以我们可以⽤Workbook来解析两个版本的Excel。
代码如下:try{//将⽂件的输⼊流转换成WorkbookWorkbook wb = WorkbookFactory.create(numFile.getInputStream());//获得第⼀个⼯作表Sheet sheet = wb.getSheetAt(0);//获得第⼀⾏Row row = sheet.getRow(0);//获得第⼀⾏的第⼀列Cell cell = row.getCell(0);}catch (Exception e){e.printStackTrace();}以上就是poi解析Excel⽂件版本问题解决办法的详解,如有疑问请留⾔或者到本站社区交流讨论,谢谢⼤家对本站的⽀持!。
DBF文件格式详细说明及程序设计
DBF文件格式详细说明及程序设计三峡大学水利与环境学院肖泽云1 DBF文件格式说明DBF文件是一种以二进制进行存储的表格数据文件,其文件内部有着严格的格式要求,具体由文件头和记录项组成。
其中文件头中包括字段的相关信息。
DBF注意,在表格记录数据中每行数据具体占多长字节,这个由文件头中定义的字段数目以及字段长度来决定,如果该文件一共只有两个字段,其中第一个字段为数值,其长度为4,第二个字段为字符串,长度为50,则每一行数据占的字节长度为4+50=54,在读取数据时也是读取前4个为第一个字段对应的值,读取第5-54个为第二个字段对应的值。
另外,为便于理解表格与下面内容的关系,特说明字段即是指表格中的列,记录指表格中的行数据,DBF按行数据方式来存储,即在文件头中定义了列数、列的名称、列的数据类型、列长度等等,然后在后面的记录数据中插入每行数据。
每个字段定义格式如下表,每个字段定义都用32个字节来完成:2 DBF文件数据结构实例分析下面以一个具体实例来分析DBF数据结构:该表格数据为:列1 列21 22 43 64 85 106 127 148 169 1810 20用UltraEdit打开该dbf文件,其内容如下:现在先分解一下,找出文件头,并分析一下文件头的内容。
首先看第一个字节,值为03,这个是16进制的数据,第一个字节表示数据库类型,值03即0x03,对应FoxBASE+/Dbase III plus,。
然后看第4个字节到第7个字节,这一段表示文件中的记录条数,即表格的行数,其Byte值为0A 00 00 00,转换成Int32即为10,即表格的行数为10。
关于Byte数组转换成数值类型,其代码如下:/// <summary>/// 将字节组转换成为整型/// </summary>/// <param name="tempBytes">字节数组</param>/// <returns></returns>public static Int32 ConvertBytesToInt32(byte[] tempBytes){Int32 result = System.BitConverter.ToInt32(tempBytes, 0); return result;}接着看第8个和第9字节,其值为61 00,转换成Int16其值即为97,意思就是说文件头所占字节长度为97,所以文件头的范围就是下面红色框内:蓝色框为左边红色框对应的值,这个仅供参考。
JAVA 解析XML 文件的三种解析方法
创建解析XML文件的三种解析方法1、第一种用w3c解析package w3c;import java.io.File;import java.io.FileOutputStream;import java.util.Random;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class w3c {public static void main(String[] args) throws Exception{ createXml();}//创建XML文档并创建节点public static void createXml() throws Exception{//获取XML解析器工厂类DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//获取XML解析器DocumentBuilder db = dbf.newDocumentBuilder();//获取操作的document对象Document document = db.newDocument();//设置XML文件的版本document.setXmlVersion("1.0");//创建根节点Element root = document.createElement("students");//将根节点添加到document对象中document.appendChild(root);//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//循环添加数据for(int i = 0 ;i < 20 ; i++){//创建根元素节点Element rootelement = document.createElement("student");//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}//设置根元素节点的属性rootelement.setAttribute("id",id);//将根元素节点添加到根节点中root.appendChild(rootelement);//设置元素节点Element name = document.createElement("name");Element sex = document.createElement("sex");Element age = document.createElement("age");Element phone = document.createElement("phone");//给元素节点赋值name.setTextContent(nameList[newRandom().nextInt(nameList.length)]);sex.setTextContent(sexList[newRandom().nextInt(sexList.length)]);age.setTextContent(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setTextContent("0756-"+tel);//将元素节点添加到根元素节点中rootelement.appendChild(name);rootelement.appendChild(sex);rootelement.appendChild(age);rootelement.appendChild(phone);}//开始把Document映射到文件TransformerFactory transFactory =TransformerFactory.newInstance();Transformer transFormer = transFactory.newTransformer();//生成的XML文件File file = new File("w3c.xml");//判断XML文件存不存在,如果不存在则创建if(file.exists()){file.createNewFile();}//设置是否添加空格transFormer.setOutputProperty(OutputKeys.INDENT, "yes");//设置输出文件的格式transFormer.setOutputProperty(OutputKeys.ENCODING, "utf-8");//输出XML文件transFormer.transform(new DOMSource(document), newStreamResult(new FileOutputStream(file)));//输出XML文件的路径System.out.println(file.getAbsolutePath());}//解析XML文档public static void resolving() throws Exception{//获取XML解析器工厂类DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//获取XML解析器DocumentBuilder db = dbf.newDocumentBuilder();//获取操作的document对象Document document = db.parse(new File("w3c.xml"));//获取XML文件的根元素节点NodeList root = document.getElementsByTagName("student");//循环根元素节点信息for(int i = 0 ; i < root.getLength() ;i++){Element student = (Element)root.item(i);System.err.println("id = "+student.getAttribute("id")+" name = "+student.getElementsByTagName("name").item(0).getTextContent()+" sex = "+student.getElementsByTagName("sex").item(0).getTextContent()+" age = "+student.getElementsByTagName("age").item(0).getTextContent()+" phone = "+student.getElementsByTagName("phone").item(0).getTextContent());}}}2、第二种用jdom解析package jdom;import java.io.FileOutputStream;import java.util.Iterator;import java.util.List;import java.util.Random;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;public class jdom {private static String xmlpath = "jdom.xml";public static void main(String[] args) throws Exception{ //resolving();createXml();}//创建XML文件并添加节点public static void createXml() throws Exception{ //创建document对象Document document = new Document();//创建根节点Element root = new Element("students");//将根节点添加到document对象中document.addContent(root);for(int i = 0 ;i < 20 ; i++){//创建根元素节点Element student = new Element("student");//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}//设置跟元素节点的属性student.setAttribute("id",id);//将根元素节点添加到根节点中root.addContent(student);//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//创建元素节点Element name = new Element("name");Element sex = new Element("sex");Element age =new Element("age");Element phone = new Element("phone");//设置根元素节点的文本值name.setText(nameList[newRandom().nextInt(nameList.length)]);sex.setText(sexList[new Random().nextInt(sexList.length)]);age.setText(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setText("0756-"+tel);//将元素节点添加到根元素节点中student.addContent(name);student.addContent(sex);student.addContent(age);student.addContent(phone);}//设置XML输出排版Format format = Format.getPrettyFormat();XMLOutputter out = new XMLOutputter(format);//输出XML文件out.output(document, new FileOutputStream(xmlpath));}//解析XML文档@SuppressWarnings("rawtypes")public static void resolving() throws Exception{//获取XML解析器SAXBuilder builder = new SAXBuilder();//获取document对象Document doucment = builder.build(xmlpath);//获取根节点Element students = doucment.getRootElement();//获取根元素节点List studentList = students.getChildren("student");//循环获取元素文本值,第一种方法for(int i = 0 ; i< studentList.size() ; i++ ){Element student = (Element)studentList.get(i);System.out.println("id ="+student.getAttributeValue("id")+" name = "+student.getChildText("name")+" sex = "+student.getChildText("sex")+" age = "+student.getChildText("age")+" phone = "+student.getChildText("phone"));}System.err.println("\n---------------------------------------------------------------------");//循环获取元素文本值,第二种方法for(Iterator iter=studentList.iterator();iter.hasNext();){ Element student = (Element)iter.next();System.out.println("id ="+student.getAttributeValue("id")+" name = "+student.getChildText("name")+" sex = "+student.getChildText("sex")+" age = "+student.getChildText("age")+" phone = "+student.getChildText("phone"));}}}3、第三种用dom4j解析package dom4j;import java.io.File;import java.io.FileWriter;import java.util.Iterator;import java.util.List;import java.util.Random;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class dom4j {private static String xmlpath = "dom4j.xml";public static void main(String[] args)throws Exception{//createXml();resolving();}public static void createXml() throws Exception{//创建document对象Document document = DocumentHelper.createDocument();//创建根节点Element root = DocumentHelper.createElement("studnets");//将根节点添加到document对象中document.setRootElement(root);for(int i = 0 ;i < 20 ; i++){//创建根元素节点并将根元素节点添加到根节点中Element student = root.addElement("student");//设置根元素节点的值//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}student.addAttribute("id",id);//创建元素节点并将元素节点添加到根元素节点中Element name = student.addElement("name");Element sex = student.addElement("sex");Element age = student.addElement("age");Element phone = student.addElement("phone");//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//设置元素节点的文本值name.setText(nameList[newRandom().nextInt(nameList.length)]);sex.setText(sexList[new Random().nextInt(sexList.length)]);age.setText(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setText("0756-"+tel);}//设置XML文件输出的格式OutputFormat format = new OutputFormat("\t", true);format.setEncoding("utf-8");XMLWriter xmlWriter = new XMLWriter(new FileWriter(xmlpath), format);//输出XML文件xmlWriter.write(document);xmlWriter.close();}//解析XML文件@SuppressWarnings("rawtypes")public static void resolving() throws Exception{//获取XML解析器SAXReader saxReader = new SAXReader();//获取document对象Document document = saxReader.read(new File(xmlpath));//获取根节点Element root = document.getRootElement();//获取根元素节点List chindList = root.elements();//循环获取元素文本值,第一种方法for(Iterator iter = chindList.iterator(); iter.hasNext();){ Element student =(Element)iter.next();System.out.println("id = "+student.attributeValue("id")+" name = "+student.elementText("name")+" sex = "+student.elementText("sex")+" age = "+student.elementText("age")+" phone = "+student.elementText("phone"));}System.err.println("\n---------------------------------------------------------------------");//循环获取元素文本值,第二种方法for(int i = 0 ; i< chindList.size() ; i++ ){Element student = (Element)chindList.get(i);System.out.println("id = "+student.attributeValue("id")+" name = "+student.elementText("name")+" sex = "+student.elementText("sex")+" age = "+student.elementText("age")+" phone = "+student.elementText("phone"));}}}。
操作(DBF格式数据)总结
DBF数据导入、导出总结--从SQL Server查询器预览dBase 文件中数据select*from openrowset('MICROSOFT.ACE.OLEDB.12.0','dBase5.0;database=D:\dbf','select * from [1111.dbf]')--若提示:无法处理对象"select * from [1.dbf]"。
链接服务器"(null)" 的OLE DB 访问接口"MICROSOFT.ACE.OLEDB.12.0" 指示该对象没有列,或当前用户没有访问该对象的权限。
--解决:这个文件损坏了,或者是需要用户名和密码select*from openrowset('VFPOLEDB.1','D:\dbf';'admin';'','select * from [1111.dbf]')--前提是系统已经安装vfpoledb 驱动select*from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver; SourceDB=D:\dbf; SourceType=DBF','select * from [1111.dbf]')--注:odbc连接dbf表出现[Microsoft][ODBC 驱动程序管理器] 驱动程序不支持此功能”错误的解决方法为原来是操作系统升级到win2003后机器上的foxpro的odbc驱动太新了。
不支持老式的访问驱动了。
--需要从一个xp系统上复制一个dll到win2003系统中覆盖,dll的名称是vfpodbc.dll, 大小为K,版本.1.8630.1。
java pdf表格解析
java pdf表格解析在Java中解析PDF表格可以使用Apache PDFBox库。
下面是使用PDFBox解析PDF表格的示例代码:```javaimport org.apache.pdfbox.cos.COSArray;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.pdmodel.PDPage;import mon.PDRectangle; import org.apache.pdfbox.text.PDFTextStripper;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;public class PdfTableParser {public static void main(String[] args) {try {PDDocument document = PDDocument.load(newFile("path_to_pdf_file.pdf"));PDFTextStripper pdfTextStripper = new PDFTextStripper();pdfTextStripper.setSortByPosition(true);PDPage firstPage = document.getPage(0);pdfTextStripper.extractRegions(firstPage);String firstPageText = pdfTextStripper.getText(document); String[] lines =firstPageText.split(pdfTextStripper.getLineSeparator());List<List<String>> tableData = new ArrayList<>();int numOfColumns = 0;for (String line : lines) {String[] cells =line.split(pdfTextStripper.getWordSeparator());List<String> rowData = new ArrayList<>();for (String cell : cells) {rowData.add(cell.trim());}numOfColumns = Math.max(numOfColumns, rowData.size());tableData.add(rowData);}for (List<String> rowData : tableData) {while (rowData.size() < numOfColumns) {rowData.add("");}}// 输出解析结果for (List<String> rowData : tableData) {for (String cellData : rowData) {System.out.print(cellData + "\t");}System.out.println();}document.close();} catch (IOException e) {e.printStackTrace();}}}```注意,该代码仅适用于简单的表格,对于复杂的表格结构可能需要进行更多的处理。
java读取dbf文件
System.out.println(field.getName()+"="+field.get());
}
}
System.out.println( "\n---还可以按字段名读取--------" );
DBF.setEncodingType("GBK");//设定当前环境下的编码,估计使用dbf的场景都是古老的GBK
//dbf.setVersion(DBFTypes.DBASEIV_WITH_MEMO);
CharField a = new CharField("column1", 10);// 定义一个字符字段名为 column1,长度是10
CharField b = new CharField("column2",10);
NumField c = new NumField("column3",5,2);// 定义一个数字字段名为 column3,总长度是5,2位小数(小数点算一位,很变态)
dbf.addField(a);
int colNum = dbf.getFieldCount();
for(int i=1;i<=rowNum;i++){
dbf.read();
System.out.println( "---row ("+i+")-----------");
for(int j=1;j<=colNum;j++){
System.out.println( "---测试创建并写入一个dbf文件"+fileName);
java解析multipartfile excel文件解析
java解析multipartfile excel文件解析1. 引言1.1 概述解析Excel文件是日常工作中非常常见的任务,尤其在Java开发领域中,需要经常处理和分析大量的数据。
而对于通过网页上传的Excel文件,我们通常会使用multipartfile来接收并解析其中的数据。
本文将介绍如何使用Java解析multipartfile类型的Excel文件,并详细讨论相关工具类和方法。
我们将从multipartfile和Excel文件简介开始,逐步深入了解如何正确处理和分析这些表格数据。
1.2 文章结构本文共分为五个主要部分,包括引言、multipartfile和excel文件简介、Java 解析multipartfile、Excel文件解析步骤以及结论。
在multipartfile和excel文件简介部分,我们将详细了解multipartfile的定义与用途,以及对于Excel文件结构与格式做一个简要说明。
这些基础知识有助于我们更好地理解后续内容。
在Java解析multipartfile部分,我们将介绍multipartfile上传与获取方式,并介绍一些重要的解析工具类。
同时,我们将深入探讨如何从multipartfile中提取出含有Excel数据的文件,并详细说明不同方法的使用。
在Excel文件解析步骤及相关方法部分,我们将按照一般流程进行讲解。
包括准备工作、读取Excel文件并获取数据,以及数据处理与分析方法。
通过这些步骤和方法,我们能够有效地获得Excel文件中的各类信息。
最后,我们将在结论部分总结全文的内容并给出一些进一步的建议和思考。
1.3 目的本文旨在帮助读者理解如何使用Java来解析multipartfile类型的Excel文件。
通过学习本文所介绍的知识和方法,读者可以从multipartfile中提取出Excel 文件,并进行数据处理和分析。
这对于需要大规模处理Excel数据的开发人员来说是十分有用的技能。
java解析dbf之通过javadbf包生成和读取dbf文件
java解析dbf之通过javadbf包⽣成和读取dbf⽂件以下是简单⽰例复制代码代码如下:package com.cramc;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import com.linuxense.javadbf.DBFException;import com.linuxense.javadbf.DBFField;import com.linuxense.javadbf.DBFReader;import com.linuxense.javadbf.DBFWriter;public class Rwdbf {public static void readDBF(String path){InputStream fis = null;try{//读取⽂件的输⼊流fis = new FileInputStream(path);//根据输⼊流初始化⼀个DBFReader实例,⽤来读取DBF⽂件信息DBFReader reader = new DBFReader(fis);//调⽤DBFReader对实例⽅法得到path⽂件中字段的个数int fieldsCount = reader.getFieldCount();System.out.println("字段数:"+fieldsCount);//取出字段信息for( int i=0; i<fieldsCount; i++){DBFField field = reader.getField(i);System.out.println(field.getName());}Object[] rowValues;//⼀条条取出path⽂件中记录while((rowValues = reader.nextRecord()) != null){for( int i=0; i<rowValues.length; i++){System.out.println(rowValues[i]);}}}catch(Exception e){e.printStackTrace();}finally{try{fis.close();}catch(Exception e){}}}public static void writeDBF(String path){OutputStream fos = null;try{//定义DBF⽂件字段DBFField[] fields = new DBFField[3];//分别定义各个字段信息,setFieldName和setName作⽤相同, //只是setFieldName已经不建议使⽤fields[0] = new DBFField();//fields[0].setFieldName("emp_code");fields[0].setName("semp_code");fields[0].setDataType(DBFField.FIELD_TYPE_C);fields[0].setFieldLength(10);fields[1] = new DBFField();//fields[1].setFieldName("emp_name");fields[1].setName("emp_name");fields[1].setDataType(DBFField.FIELD_TYPE_C);fields[1].setFieldLength(20);fields[2] = new DBFField();//fields[2].setFieldName("salary");fields[2].setName("salary");fields[2].setDataType(DBFField.FIELD_TYPE_N);fields[2].setFieldLength(12);fields[2].setDecimalCount(2);//DBFWriter writer = new DBFWriter(new File(path));//定义DBFWriter实例⽤来写DBF⽂件DBFWriter writer = new DBFWriter();//把字段信息写⼊DBFWriter实例,即定义表结构writer.setFields(fields);//⼀条条的写⼊记录Object[] rowData = new Object[3];rowData[0] = "1000";rowData[1] = "John";rowData[2] = new Double(5000.00);writer.addRecord(rowData);rowData = new Object[3];rowData[0] = "1001";rowData[1] = "Lalit";rowData[2] = new Double(3400.00);writer.addRecord(rowData);rowData = new Object[3];rowData[0] = "1002";rowData[1] = "Rohit";rowData[2] = new Double(7350.00);writer.addRecord(rowData);//定义输出流,并关联的⼀个⽂件fos = new FileOutputStream(path);//写⼊数据writer.write(fos);//writer.write();}catch(Exception e){e.printStackTrace();}finally{try{fos.close();}catch(Exception e){}}}public static void main(String[] args){String path ="E:\\tmp\\2\ x.dbf";try {InputStream fis = new FileInputStream(path);DBFReader reader = new DBFReader(fis);int fieldsCount = reader.getFieldCount();System.out.println("字段数:"+fieldsCount);DBFField[] df = new DBFField[fieldsCount+2];for( int i=0; i<fieldsCount; i++){df[i] = reader.getField(i);System.out.println("field"+i+":"+df[i].getName());}df[fieldsCount] = new DBFField();df[fieldsCount].setName("add1");df[fieldsCount].setDataType(DBFField.FIELD_TYPE_C); df[fieldsCount].setFieldLength(10);df[fieldsCount+1] = new DBFField();df[fieldsCount+1].setName("add2");df[fieldsCount+1].setDataType(DBFField.FIELD_TYPE_C); df[fieldsCount+1].setFieldLength(10);DBFWriter writer = new DBFWriter();writer.setFields(df);Object[] rowValues;Object[] rowValues1 = new Object[fieldsCount+2];//⼀条条取出path⽂件中记录while((rowValues = reader.nextRecord()) != null){for(int i=0;i<fieldsCount;i++){rowValues1[i] = rowValues[i];}rowValues1[fieldsCount]="x";rowValues1[fieldsCount+1]="xx";writer.addRecord(rowValues1);}path ="E:\\tmp\\2\\test2.dbf";OutputStream fos = new FileOutputStream(path);//写⼊数据writer.write(fos);System.out.println("OVER");} catch (FileNotFoundException | DBFException e) {// TODO Auto-generated catch block e.printStackTrace();}}}。
用JSP/Servlet和JavaBeans技术实现SQL Server表与DBF文件的相互转换
( oeeoIf m tnEg e e , aeagUi rt, C lg fn r ao ni e g N nhn n esy l o i nA v i ag302 ,Ci ) n 309 h a n
中图分类号 :P 1 T 31
;Q e ; B ; S LSn D F转换
文献标识码 : A
T a s r t nB tenS evr a l a dD FFl U igJ P Srl n aa en rnf mai ew e QLSre be n B i s S / eve a dJvB as o o T e n t
表与 D F B 文件相互转换 的方法, 使转换工作可在网 对于 We 浏览器一样 , pl 装 入 We b Apt e b浏览器并在 页中自动完成 , 更加方便 、 灵活。 We 浏览器内执行, Sre则是装入 We b 而 ev t l b服务器 并在 We 服务器 内执行。S l 可 以看成是 用 J a b e e v r t a v
m rnbtenS LSre t l adD Ff . ao e e Q e vra e n B i i w b l e K yw rsJP srl ; aa e od:S/ v t Jv e e ; Q r r D F t nfm tn S LS v ; B ; r s rao e e a o i
成为信息 系统建设的一个必然趋势。然而数据库的 页面 , 从而实现了页面逻辑与其设计和显示 的分 离。 种类 繁多 , 期 的数 据库 管理 系统 常 采用小 型 的 JP 早 S 技术的设计 目的是使得构造基于 We b的应用程 而这些应用程序能够与各种 We b D a ,o ae Vu l o r 等 , bs Fx s, i a Fx o 而现在主流的数据库 序更加容易和快捷 , e b s P 系统是 S LSr r B 、r l等, 以在系统设计 中 Q v 、 2Oa e 所 eeD c 服务器、 应用服务器 、 浏览器和开发工具共同工作。 经常会遇 到库间转换 的问题。用手动的方式固然可 12 ev . Sri a技术
java读取dbf文件
System.out.println("column2="+ dbf.getField("column
?package dbf;
import org.xBaseJ.DBF;
import org.xBaseJ.DBFTypes;
import org.xBaseJ.fields.CharField;
* xBasej稍好些,起码更新到2014年,也更像一个数据库操作api,但也有些坑在里面,
* 特此写个例程记录一下,也希望有人看了少花费时间再去研究这种逐渐会没价值的东西
* @author liangzh
*/
public class DBFTest {
/**
* @param args
import org.xBaseJ.fields.Field;
import org.xBaseJ.fields.NumField;
/**
* java 读写 DBF 文件
*
* 现在还有不少古老场景读取dbf文件,但对于java程序员来说可用的lib太少,只有 javadbf和xBaseJ
//dbf.setVersion(DBFTypes.DBASEIV_WITH_MEMO);
CharField a = new CharField("column1", 10);// 定义一个字符字段名为 column1,长度是10
JAVA使用geotools读取shape格式文件的方法
JAVA使⽤geotools读取shape格式⽂件的⽅法先看下JAVA⽤geotools读取shape格式⽂件Shapefile属于⼀种⽮量图形格式,它能够保存⼏何图形的位置及相关属性。
但这种格式没法存储地理数据的拓扑信息。
其中,要组成⼀个Shapefile,有三个⽂件是必不可少的,它们分别是".shp", ".shx"与 ".dbf"⽂件.shp— 图形格式,⽤于保存元素的⼏何实体。
.shx— 图形索引格式。
⼏何体位置索引,记录每⼀个⼏何体在shp⽂件之中的位置,能够加快向前或向后搜索⼀个⼏何体的效率。
.dbf— 属性数据格式,以dBase IV的数据表格式存储每个⼏何形状的属性数据。
下⾯将介绍如何通过Java读取Shape⽂件中的内容信息我们的pom⽂件<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.herbert.geotool</groupId><artifactId>geo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>19.2</version><scope>system</scope></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-opengis</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-data</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-api</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-metadata</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-referencing</artifactId><version>19.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId><version>19.2</version></dependency><dependency><groupId>org.json.simple</groupId><artifactId>json-simple</artifactId><version>1.1</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-pool</artifactId><version>1.5.4</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency></dependencies></project>具体Java代码package com.herbert.geotoool.util;import org.geotools.data.shapefile.ShapefileDataStore;import org.geotools.data.simple.SimpleFeatureIterator;import org.geotools.data.simple.SimpleFeatureSource;import org.geotools.geojson.feature.FeatureJSON;import org.opengis.feature.simple.SimpleFeature;import java.io.File;import java.io.IOException;import java.io.StringWriter;import java.nio.charset.Charset;/*** @author :Herbert* @date :Created in 2019/12/26 17:01* @description:* @modified By:* @version: $*/public class ShapeModel {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();String SHAPE_FILE = "F:\\MapData\\gisMap\ ian\\街道界线.shp"; // ShapeFile全路径// 使⽤GeoTools读取ShapeFile⽂件File shapeFile = new File(SHAPE_FILE);ShapefileDataStore store = new ShapefileDataStore(shapeFile.toURI().toURL());//设置编码Charset charset = Charset.forName("GBK");store.setCharset(charset);SimpleFeatureSource sfSource = store.getFeatureSource();SimpleFeatureIterator sfIter = sfSource.getFeatures().features();// 从ShapeFile⽂件中遍历每⼀个Feature,然后将Feature转为GeoJSON字符串while (sfIter.hasNext()) {SimpleFeature feature = (SimpleFeature) sfIter.next();// Feature转GeoJSONFeatureJSON fjson = new FeatureJSON();StringWriter writer = new StringWriter();fjson.writeFeature(feature, writer);String sjson = writer.toString();System.out.println("sjson===== >>>> " + sjson);}System.out.println("数据导⼊完成,共耗时"+(System.currentTimeMillis() - start)+"ms");}}读取数据显⽰:补充:JAVA 根据数据库表内容⽣产树结构JSON数据的实例代码1、利⽤场景 组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段2、构造数据(以下数据并不是组织机构数据,⽽纯属本⼈胡编乱造的数据)List<Tree<Test>> trees = new ArrayList<Tree<Test>>();tests.add(new Test("0", "", "关于本⼈"));tests.add(new Test("1", "0", "技术学习"));tests.add(new Test("2", "0", "兴趣"));tests.add(new Test("3", "1", "JAVA"));tests.add(new Test("4", "1", "oracle"));tests.add(new Test("5", "1", "spring"));tests.add(new Test("6", "1", "springmvc"));tests.add(new Test("7", "1", "fastdfs"));tests.add(new Test("8", "1", "linux"));tests.add(new Test("9", "2", "骑⾏"));tests.add(new Test("10", "2", "吃喝玩乐"));tests.add(new Test("11", "2", "学习"));tests.add(new Test("12", "3", "String"));tests.add(new Test("13", "4", "sql"));tests.add(new Test("14", "5", "ioc"));tests.add(new Test("15", "5", "aop"));tests.add(new Test("16", "1", "等等"));tests.add(new Test("17", "2", "等等"));tests.add(new Test("18", "3", "等等"));tests.add(new Test("19", "4", "等等"));tests.add(new Test("20", "5", "等等"));3、源码Tree.javapackage pers.kangxu.datautils.bean.tree;import java.util.ArrayList;import java.util.List;import java.util.Map;import com.alibaba.fastjson.JSON;/*** tree TODO <br>** @author kangxu2 2017-1-7**/public class Tree<T> {/*** 节点ID*/private String id;/*** 显⽰节点⽂本*/private String text;/*** 节点状态,open closed*/private String state = "open";/*** 节点是否被选中 true false*/private boolean checked = false;/*** 节点属性*/private List<Map<String, Object>> attributes;/*** 节点的⼦节点*/private List<Tree<T>> children = new ArrayList<Tree<T>>();/*** ⽗ID*/private String parentId;/*** 是否有⽗节点*/private boolean isParent = false;/*** 是否有⼦节点*/private boolean isChildren = false;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getState() {return state;}public void setState(String state) {this.state = state;}public boolean isChecked() {return checked;}public void setChecked(boolean checked) {this.checked = checked;}public List<Map<String, Object>> getAttributes() {return attributes;}public void setAttributes(List<Map<String, Object>> attributes) { this.attributes = attributes;}public List<Tree<T>> getChildren() {return children;}public void setChildren(List<Tree<T>> children) {this.children = children;}public boolean isParent() {return isParent;}public void setParent(boolean isParent) {this.isParent = isParent;}public boolean isChildren() {return isChildren;}public void setChildren(boolean isChildren) {this.isChildren = isChildren;}public String getParentId() {return parentId;}public void setParentId(String parentId) {this.parentId = parentId;}public Tree(String id, String text, String state, boolean checked, List<Map<String, Object>> attributes, List<Tree<T>> children, boolean isParent, boolean isChildren, String parentID) {super();this.id = id;this.text = text;this.state = state;this.checked = checked;this.attributes = attributes;this.children = children;this.isParent = isParent;this.isChildren = isChildren;this.parentId = parentID;}public Tree() {super();}@Overridepublic String toString() {return JSON.toJSONString(this);}}BuildTree.javapackage mon.tree;import java.util.ArrayList;import java.util.List;import pers.kangxu.datautils.bean.tree.Tree;/*** 构建tree* TODO* <br>* @author kangxu2 2017-1-7**/public class BuildTree {/**** TODO* <br>* @author kangxu2 2017-1-7** @param nodes* @return*/public static <T> Tree<T> build(List<Tree<T>> nodes) {if(nodes == null){return null;}List<Tree<T>> topNodes = new ArrayList<Tree<T>>();for (Tree<T> children : nodes) {String pid = children.getParentId();if (pid == null || "".equals(pid)) {topNodes.add(children);continue;}for (Tree<T> parent : nodes) {String id = parent.getId();if (id != null && id.equals(pid)) {parent.getChildren().add(children);children.setParent(true);parent.setChildren(true);continue;}}}Tree<T> root = new Tree<T>();if (topNodes.size() == 0) {root = topNodes.get(0);} else {root.setId("-1");root.setParentId("");root.setParent(false);root.setChildren(true);root.setChecked(true);root.setChildren(topNodes);root.setText("顶级节点");}return root;}}BuildTreeTester.javapackage pers.kangxu.datautils.test;import java.util.ArrayList;import java.util.List;import pers.kangxu.datautils.bean.tree.Tree;import mon.tree.BuildTree;public class BuildTreeTester {public static void main(String[] args) {List<Tree<Test>> trees = new ArrayList<Tree<Test>>();List<Test> tests = new ArrayList<Test>();tests.add(new Test("0", "", "关于本⼈"));tests.add(new Test("1", "0", "技术学习"));tests.add(new Test("2", "0", "兴趣"));tests.add(new Test("3", "1", "JAVA"));tests.add(new Test("4", "1", "oracle"));tests.add(new Test("5", "1", "spring"));tests.add(new Test("6", "1", "springmvc"));tests.add(new Test("7", "1", "fastdfs"));tests.add(new Test("8", "1", "linux"));tests.add(new Test("9", "2", "骑⾏"));tests.add(new Test("10", "2", "吃喝玩乐"));tests.add(new Test("11", "2", "学习"));tests.add(new Test("12", "3", "String"));tests.add(new Test("13", "4", "sql"));tests.add(new Test("14", "5", "ioc"));tests.add(new Test("15", "5", "aop"));tests.add(new Test("16", "1", "等等"));tests.add(new Test("17", "2", "等等"));tests.add(new Test("18", "3", "等等"));tests.add(new Test("19", "4", "等等"));tests.add(new Test("20", "5", "等等"));for (Test test : tests) {Tree<Test> tree = new Tree<Test>();tree.setId(test.getId());tree.setParentId(test.getPid());tree.setText(test.getText());trees.add(tree);}Tree<Test> t = BuildTree.build(trees);System.out.println(t);}}class Test {private String id;private String pid;private String text;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getPid() {return pid;}public void setPid(String pid) {this.pid = pid;}public String getText() {return text;}public void setText(String text) {this.text = text;}public Test(String id, String pid, String text) {super();this.id = id;this.pid = pid;this.text = text;}public Test() {super();}@Overridepublic String toString() {return "Test [id=" + id + ", pid=" + pid + ", text=" + text + "]"; }}4、运⾏结果JSON数据:{"checked": true,"children": [{"checked": false,"children": [{"checked": false,"children": [{"checked": false,"children": [{"checked": false,"children": [],"id": "12","parent": true,"parentId": "3",},{"checked": false, "children": [],"id": "18","parent": true,"parentId": "3","state": "open", "text": "等等"}],"id": "3","parent": true,"parentId": "1","state": "open","text": "JAVA"},{"checked": false, "children": [{"checked": false, "children": [],"id": "13","parent": true,"parentId": "4","state": "open", "text": "sql"},{"checked": false, "children": [],"id": "19","parent": true,"parentId": "4","state": "open", "text": "等等"}],"id": "4","parent": true,"parentId": "1","state": "open","text": "oracle"},{"checked": false, "children": [{"checked": false, "children": [],"id": "14","parent": true,"parentId": "5","state": "open", "text": "ioc"},{"checked": false, "children": [],"id": "15","parent": true,"parentId": "5","state": "open", "text": "aop"},{"checked": false, "children": [],"id": "20","parent": true,"parentId": "5","state": "open", "text": "等等"}],"id": "5","parent": true,"parentId": "1","state": "open","text": "spring"},{"checked": false, "children": [],"id": "6","parent": true,"parentId": "1","state": "open","text": "springmvc" },{"checked": false, "children": [],"id": "7","parent": true,"parentId": "1","state": "open","text": "fastdfs"},{"checked": false, "children": [],"id": "8","parent": true,"parentId": "1","state": "open","text": "linux"},{"checked": false, "children": [],"id": "16","parent": true,"parentId": "1","state": "open","text": "等等"}],"id": "1","parent": true,"text": "技术学习"},{"checked": false,"children": [{"checked": false,"children": [],"id": "9","parent": true,"parentId": "2","state": "open","text": "骑⾏"},{"checked": false,"children": [],"id": "10","parent": true,"parentId": "2","state": "open","text": "吃喝玩乐"},{"checked": false,"children": [],"id": "11","parent": true,"parentId": "2","state": "open","text": "学习"},{"checked": false,"children": [],"id": "17","parent": true,"parentId": "2","state": "open","text": "等等"}],"id": "2","parent": true,"parentId": "0","state": "open","text": "兴趣"}],"id": "0","parent": false,"parentId": "","state": "open","text": "关于本⼈"}],"id": "-1","parent": false,"parentId": "","state": "open","text": "顶级节点"}总结到此这篇关于JAVA使⽤geotools读取shape格式⽂件的⽅法的⽂章就介绍到这了,更多相关java geotools读取shape格式内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
dbf文件格式说明
dBase是第一个在个人电脑上被广泛使用的单机版数据库系统,在CP/M与DOS的时期,由Ashton-Tate公司所发表。
在1980年,它最初是出现在CP/M的软件,而后被移植到Apple II与IBM PC的DOS上。
在dBase III与dBase III Plus时,成为当时数据库市场的主流,而后其他公司推出功能相近甚至是强化的产品,例如Clipper或FoxPro,它们被称为xBase。
1.DBF文件的整体结构
②DBF文件头中记录项(字段)的详细格式:
③ DBF文件中的数据类型:
举例说明:
假如文件中有10条记录,每个记录有4个字段,4个字段的长度分别为:12、14、16、18,那么文件的详细格式如下:
文件头占32+32*4+2个字节:
前32个字节是文件头中的基本信息,32*4个字节是记录项(即字段的定义信息),最后两个字节分别是16进制的0D 和20,0D代表上文表格中说明的记录项终止标识。
20代表一个空格。
数据信息占(12+14+16+18)*10+1个字节:
12+14+16+18个字节代表一条记录,共10条记录。
最后一个字节是数据的终止表示通常是16进制表示的1A
补充说明:
由于上述文件格式的定义,决定了字段名称不能超过11个字节(或者5个中文字符),字符类型的字段,数据最大不能超过255个字节。
在从文本、Excel、大型数据库导出数据到DBF格式文件时,一定要考虑到这些长度限制。
使用JAVA写出DBF出现乱码和数据错位
然后我发现导出的 DBF 文件是从某一列以后开始产生数据错位的,该 DBF 总共有 5 列:目录号、文件号、题名、总页数、负责人。本该属于题名的列数据 全都跑到总页数里面去了,后面的各列数据也都往后偏移一列。于是查看了导出 的 DBF 文件的表结构,居然意外的发现题名那一列的宽度是 0,检查代码,在代 码里写进去的列宽度分别是 20、30、512、30、20,因为考虑到题名字段的内容 比较多,所以故意将其长度设的比较大,可是不明白为什么他会变成 0 呢,看了 DBFField.java 的 setFieldLength 方法,如果传进去的时候就是 0 的话,他应 该会打印 Field length should be a positive number 这一句话的,
复的";
rowData[2] = "222"; writer.setCharactersetName("GBK"); writer.addRecord(rowData);
rowData = new Object[3]; rowData[0] = "1002"; rowData[1] = "Rohit"; rowData[2] = "333";
fields[1] = new DBFField(); fields[1].setName("年龄"); fields[1].setDataType( DBFField.FIELD_TYPE_N); fields[1].setFieldLength(768);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//
pre.setString(1,data[4]);
//
pre.setString(2,data[5]);
pre.executeUpdate();
pre.close();
String
sql
=
"insert
into
fwsk_fpcgl_bd
(SWJG_DM,BS_NSRSBH,BSYF,FPDM,FPHM,GF_NSRSBH,XF_NSRSBH,JE,SE,KPRQ," +
data[9] + ",to_date('" + data[10] +
"','yyyy-mm-dd'),'" + data[11] + "','" + data[12] +
"',to_date('"
+ data[16] + "','yyyy-mm-dd'),'" + data[20] + "','" +
//
rs = pre.executeQuery();
//
if (rs != null) {
//
while (rs.next()) {
//
cktsqysh += rs.getString("NSRSBH") + ",";
//
}
//
}
InputStream inputStream = new FileInputStream(readFile); // take dbf file as program argument
import java.sql.PreparedStatement; import org.springframework.context.ApplicationContext; import com.zhuhai.ctasejb.EjbIni; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.Connection; import org.springframework.context.support.FileSystemXmlApplicationContext; import java.sql.*;
public class JavaDBFReader { //中文编码问题 private String getStrByCharToByte(String str) { byte[] temp = new byte[str.length()]; for (int i = 0; i < str.length(); i++) { temp[i] = (byte) (str.charAt(i)); } return new String(temp); } private Connection conn = null; private static Context context; private BufferedReader br; private String readFile; static Logger logger = Logger.getLogger("pub.readtxtfile");
"' and FPHM= '" + data[5] + "' ";
//String del ="delete from fwsk_fpcgl_bd where FPDM= ? and FPHM= ? ";
//conn.runUpdate(del);
pre = conn.prepareStatement(del);
Object[] rowObjects;
int[] skipIndex = {2, 13, 14, 15, 17, 18, 19, 21, 22, 24, 26}; while ((rowObjects = reader.nextRecord()) != null) {
String[] data = new String[rowObjects.length];
data[23] + "',"
+ data[25] + ")";
pre = conn.prepareStatement(sql);
try { if (pre.executeUpdate() == 1) { line++; //System.out.println("line="+line); pre.close(); } if (line == count) { logMsg = "共" + count + "条数据,全部成功导入"; } else { logMsg = "共" + count + "条数据,有" + (count - line) + "条数据未成功导入"; }
(*.dbf)};DBQ=" + filePath + ";","",""); sql = "select * from " + fileName; psDbf = connDbf.prepareStatement(sql); rsDbf = psDbf.executeQuery();
//按行解析 dbf 文件
" ZFBZ,BDBZ,BSSJ,BLBZ,FP_LB,SL) values ('" + data[0] +
"','" + data[1] + "'," + data[3] + ",'" + data[4] +
"','" + data[5] + "','"
+ data[6] + "','" + data[7] + "'," + data[8] + "," +
package com.zhuhai.impdata;
import com.linuxense.javadbf.*; import java.io.*; import com.zhuhai.db.conn.dbConnect; import java.sql.ResultSet; import org.apache.log4j.Logger; import java.util.Date; import java.text.SimpleDateFormat; import java.sql.Statement;
}
private String readDbf() { String logMsg = ""; String strsql = ""; double doufpje = 0.00; int count =0;
//dbConnect conn = null; PreparedStatement pre = null; ResultSet rs = null;
for (int i = 0; i < rowObjects.length; i++) {
String temp = "";
if (i < skipIndex.length && i == skipIndex[i]) {
continue;
}
if (rowObjects[i] != null) {
if (i == 10 || i == 16) {
}
}
data[i] = temp.trim();
}
//System.out.println("data[7] = "+data[7]+"?");
//
int boo = 0;
//
boo = cktsqysh.indexOf(data[7]);
// if (boo != -1) {
count++;
String del = "delete from fwsk_fpcgl_bd where FPDM= '" + data[4] +
//下面这种是不用装驱动就能解析的 Connection connDbf = null; PreparedStatement psDbf = null; ResultSet rsDbf = null; //一个目录名称,下面存放DBF文件 String filePath = "D:/temp"; //一个DBF文件夹,实际文件名称为 tbUser.dbf,这里做为表名不用扩展名就可以 String fileName = "tbUser"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); connDbf = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft dBase Driver