扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
byte[] bytes = new byte[BUFFER_SIZE]; FileInputStream inputFile = null; try { File file = new File("xmldata.xml"); if (file.exists()) { inputFile = new FileInputStream(file); int ch = inputFile.read(bytes, 0, BUFFER_SIZE); while (ch != -1) { output.write(bytes, 0, ch); ch = inputFile.read(bytes, 0, BUFFER_SIZE); } } |
清单 4 中的代码创建了一个长度缓冲区 BUFFER_SIZE。 BUFFER_SIZE 常量的值可以是 1024 或更高。通过调用 inputFile.read() 方法将输入文件(xmldata.xml)的内容读取到缓冲区中。进行缓冲之后,output.write() 方法将文件数据写入到 OutputStream 对象的套接字中。最后一步将数据通过网络发送到等待中的客户机中。这些功能居然只需要这么少的代码!
接下来,您需要使客户机处理传入的 XML 数据。
接收数据的 Java 客户机获得 XML 内容(并不是 XML 文件)
客户机如何接收 XML 数据?同样,对于 Java 技术来说这只是小事一桩。数据接收通过一个套接字对象完成。清单 5 展示的代码将接收传入的数据并将数据推入到 ArrayList 类的对象中。
客户机现在必须解决两个与所接收数据项的数量有关的问题。由于这是一个松散耦合的场景,您必须假定客户机并不清楚服务配置文件(即 清单 1 中的代码)中包含了多少 XML 数据项。因此,您必须确定一些方法来接收和处理精确的数据项数量。第二个问题比较容易解决,就是如何保存处理过的数据。您将看到,清单 5 同时解决了这两个问题。
清单 5. 提取嵌入的 XML 数据
XMLDecoder d = new XMLDecoder(input); try { while (true) ArrayList<Object[]> rowList = new ArrayList<Object[]>(); { String dataItem = (String)d.readObject(); System.out.println("XML decoded data: " + dataItem); rowList.add(dataItem); } } } catch (Exception exc) { if (exc instanceof ArrayIndexOutOfBoundsException) { // No more records to process System.out.println("Parsed all XML records - " + "threw exception. Number of rows: " + rowList.size()); } } d.close(); |
从 InputStream 对象接收的 XML 数据被保存在 ArrayList 类的一个对象中。该类对于此类应用程序非常有用。完成类定义之后,ArrayList 具有一个特定的容量,总是匹配底层列表的大小。在添加元素时,ArrayList 对象的容量将自动扩展。因此,您无需担心会超过数组的极限,因为该类将为您处理这一问题。
此时,客户机具有 清单 1 中数据的副本。客户机现在可以将带宽元素修改为所需的值,然后反向执行文件传输过程,从客户机发送到服务器。通过将 XML 文件从服务器移动到客户机,客户机实际上使用了这一服务。更新后的数据被发送回服务器以完成事务。当然,服务提供商必须验证传入的数据并提供所需的带宽更改。
本文描述的这种模式首先将一个 XML 文件通过网络传输到客户机。客户机将文件数据作为流进行接收,然后将其解析为一个内存驻留对象。客户机随后对内存驻留对象进行更改,然后反向执行传输过程,将对象发回到服务器。
还存在一种服务,其中 XML 数据被完整无缺地从服务器传输到客户机。这种场景中,客户机使用某种形式的文件传输协议(例如 FTP)获得完整的文件副本。由于文件传输是一种标准技术,这里不作过多介绍,您只需了解客户机将下载 清单 1 中服务配置数据的一个文件副本。此时,客户机需要解析并修改文件,然后传输回服务器,这种模式的工作原理是什么?
一种基于 XML 文件的 Java 机制
客户机现在将服务配置文件的副本保存在磁盘中。必须对该文件进行解析以提取 XML 数据。让人意外的是,这实现起来有些难度,对于较大的文件尤其如此。解决问题的关键是使用合适的解析工具。本文中使用的工具是 dom4j,该工具允许您将 XML 数据解析为一个 Java 对象。您还可以使用一个基于 Simple API for XML (SAX) 的解析器,但是 SAX 是一种较低级的技术。您将看到,dom4j 工具仅需要很少的工作即可完成解析。清单 6 引用自本文附带的 ProcessEventXml.java 文件,展示了使用 dom4j 解析文件所需的主要元素。
清单 6. dom4j 处理 XML 数据
try { handler.treeWalk(handler.parse(new File(argv[0]))); } catch (Throwable t) { t.printStackTrace(); } } public Document parse(File url) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(url); return document; } public void treeWalk(Document document) throws Exception { treeWalk(document.getRootElement()); } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者