资源预览内容
第1页 / 共68页
第2页 / 共68页
第3页 / 共68页
第4页 / 共68页
第5页 / 共68页
第6页 / 共68页
第7页 / 共68页
第8页 / 共68页
第9页 / 共68页
第10页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
关于关于 Java 您不知道的您不知道的 5 件事件事系列系列 目录目录 关于 Java 您不知道的 5 件事系列 . 1 关于 Java 常用工具您不知道的 5 件事 . 1 关于 JVM 命令行标志您不知道的 5 件事. 11 关于 Java Database Connectivity 您不知道的 5 件事 . 13 关于 Java Scripting API 您不知道的 5 件事. 19 关于 Java 性能监控您不知道的 5 件事,第 1 部分 . 25 关于 Java 性能监控您不知道的 5 件事,第 2 部分 . 27 关于 JAR 您不知道的 5 件事 . 30 关于 java.util.concurrent 您不知道的 5 件事,第 1 部分 . 35 关于 java.util.concurrent 您不知道的 5 件事,第 2 部分 . 40 关于 Java Collections API 您不知道的 5 件事,第 1 部分 . 46 关于 Java Collections API 您不知道的 5 件事,第 2 部分 . 53 关于 Java 对象序列化您不知道的 5 件事 . 59 关于关于 Java 常用工具您不知道的常用工具您不知道的 5 件事件事 很多年前,当我还是高中生的时候,我曾考虑以小说作家作为我的职业追求,我订阅了一 本 Writers Digest 杂志。我记得其中有篇专栏文章,是关于 “太小而难以保存的线头”,专栏作者描述厨房储物抽屉中放满了无法分类的玩意儿。 这句话我一直铭记在心, 它正好用来 描述本文的内容,本系列的最后一篇(至少目前是这样)。 Java 平台就充满了这样的 “线头” 有用的命令行工具和库,大多数 Java 开发人员甚至 都不知道,更别提使用了。其中很多无法划分到之前的 5 件事 系列 的编程分类中,但不管 怎样,尝试一下:有些说不定会在您编程的厨房抽屉中占得一席之地。 1. StAX 在千禧年左右,当 XML 第一次出现在很多 Java 开发人员面前时,有两种基本的解析 XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。 DOM 解析器将整个 XML 文档加入内存,并切割成离散的对象,它们连接在一起形成一个 树。该树描述了文档的整个 XML Infoset 表示法。这两个解析器都有缺点:SAX 太低级,无法使用,DOM 代价太大,尤其对于大的 XML 文件 整个树成了一个庞然大物。 幸运的是,Java 开发人员找到第三种方法来解析 XML 文件,通过对文档建模成 “节点”,它们可以从文档流中一次取出一个,检查,然后处理或丢弃。这些 “节点” 的 “流” 提供了 SAX 和 DOM 的中间地带,名为 “Streaming API for XML”,或者叫做 StAX。(此缩写用于区分新的 API 与原来的 SAX 解析器,它与此同名。)StAX 解析器后来包装到了 JDK 中,在 javax.xml.stream 包。 使用 StAX 相当简单:实例化 XMLEventReader,将它指向一个格式良好的 XML 文件,然后一次 “拉出” 一个节点(通常用 while 循环),查看。例如,在清单 1 中,列 举出了 Ant 构造脚本中的所有目标: 清单清单 1. 只是让只是让 StAX 指向目标指向目标 import java.io.*; import javax.xml.namespace.QName; import javax.xml.stream.*; import javax.xml.stream.events.*; import javax.xml.stream.util.*; public class Targets public static void main(String args) throws Exception for (String arg : args) XMLEventReader xsr = XMLInputFactory.newInstance() .createXMLEventReader(new FileReader(arg); while (xsr.hasNext() XMLEvent evt = xsr.nextEvent(); switch (evt.getEventType() case XMLEvent.START_ELEMENT: StartElement se = evt.asStartElement(); if (se.getName().getLocalPart().equals(“target“) Attribute targetName = se.getAttributeByName(new QName(“name“); / Found a target! System.out.println(targetName.getValue(); break; / Ignore everything else StAX 解析器不会替换所有的 SAX 和 DOM 代码。但肯定会让某些任务容易些。尤其对 完成不需要知道 XML 文档整个树结构的任务相当方便。 请注意,如果事件对象级别太高,无法使用,StAX 也有一个低级 API 在 XMLStreamReader 中。尽管也许没有阅读器有用,StAX 还有一个 XMLEventWriter,同样,还有一个 XMLStreamWriter 类用于 XML 输出。 2. ServiceLoader Java 开发人员经常希望将使用和创建组件的内容区分开来。这通常是通过创建一个描述组件动作的接口,并使用某种中介创建组件实例来完成的。很多开发人员使用 Spring 框架来 完成,但还有其他的方法,它比 Spring 容器更轻量级。 java.util 的 ServiceLoader 类能读取隐藏在 JAR 文件中的配置文件, 并找到接 口的实现, 然后使这些实现成为可选择的列表。 例如, 如果您需要一个私仆 (personal-servant)组件来完成任务,您可以使用清单 2 中的代码来实现: 清单清单 2. IPersonalServant public interface IPersonalServant / Process a file of commands to the servant public void process(java.io.File f) throws java.io.IOException; public boolean can(String command); can() 方法可让您确定所提供的私仆实现是否满足需求。清单 3 中 的 ServiceLoader 的 IPersonalServant 列表基本上满足需求: 清单清单 3. IPersonalServant 行吗?行吗? import java.io.*; import java.util.*; public class Servant public static void main(String args) throws IOException ServiceLoader servantLoader = ServiceLoader.load(IPersonalServant.class); IPersonalServant i = null; for (IPersonalServant ii : servantLoader) if (ii.can(“fetch tea“) i = ii; if (i = null) throw new IllegalArgumentException(“No suitable servant found“); for (String arg : args) i.process(new File(arg); 假设有此接口的实现,如清单 4: 清单清单 4. Jeeves 实现了实现了 IPersonalServant import java.io.*; public class Jeeves implements IPersonalServant public void process(File f) System.out.println(“Very good, sir.“); public boolean can(String cmd) if (cmd.equals(“fetch tea“) return true; else return false; 剩下的就是配置包含实现的 JAR 文件,让 ServiceLoader 能识别 这可能会非常棘手。 JDK 想要 JAR 文件有一个 META-INF/services 目录, 它包含一个文本文件, 其文件名与接口类名完全匹配 本例中 是 META-INF/services/IPersonalServant。接口类名的内容是实现的名称,每行一个,如清单 5: 清单清单 5. META-INF/services/IPersonalServant Jeeves # comments are OK 幸运的是,Ant 构建系统(自 1.7.0 以来)包含一个对 jar 任务的服务标签,让这相对容 易,见清单 6: 清单清单 6. Ant 构建的构建的 IPersonalServant 这里,很容易调用 IPersonalServant,让它执行命令。然而,解析和执行这些命令可能会非常棘手。这又是另一个 “小线头”。 3. Scanner 有无数 Java 工具能帮助您构建解析器,很多函数语言已成功构建解析器函数库(解析器 选择器)。但如果要解析的是逗号分隔值文件,或空格分隔文本文件,又怎么办呢?大多数工具用在此处就
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号