- 浏览: 241741 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (172)
- J2SE学习模块 (35)
- Oracle学习模块 (12)
- Jsp学习模块 (11)
- Servlet学习模块 (1)
- Tomcat 模块 (4)
- Struts1.x学习模块 (5)
- Spring学习模块 (2)
- Hibernate学习模块 (11)
- XML学习模块 (1)
- UML学习模块 (0)
- 算法学习模块 (6)
- 设计模式模块 (2)
- Mysql学习模块 (1)
- SQL_Server学习模块 (8)
- 项目开发模块 (10)
- 搜索引擎 (14)
- 开发工具的使用 (2)
- 面试题集 (7)
- 开发工具 (8)
- Linux (5)
- JavaFX模块 (1)
- 程序与人生 (4)
- 计算机网络 (6)
- EJB学习模块 (1)
- javascript常用模块 (2)
- 英语学习 (1)
- 程序变量命名的几条法则:匈牙利命名法 (1)
- 驼峰式大小写 (1)
- 帕斯卡命名法 (1)
- Jquery控制图片宽度及高度 (1)
- 喜讯--FireFox7.01已经支持CSS中 text-overflow ellipsis 属性 (1)
- 遍历 Map 的三种 常用方法 java (1)
- JDK自带工具Jstat (1)
- 提高 Oracle 查询 效率 建议 (1)
- 常用工具 (1)
最新评论
-
a465492689:
挺好,谢谢分享
存储过程 -
huangqinghe:
ding 顶~~~
Intellij Idea12 中文乱码问题总结 -
Redpick13:
楼主好人啊,有耐心
Java中的二维数组的定义与学习 -
dandongsoft:
神鼎飞丹砂
java.lang.NoClassDefFoundError: org/apache/lucene/index/memory/MemoryIndex -
devil__lord:
不错讲得很清楚 color=#cff
Java中的二维数组的定义与学习
简介: 有些 Java™ 工具无法分类,只能算作 “有用的东西”。本期 5 件事系列 将介绍一些您乐于拥有的工具,即使您将它们放到厨房抽屉里。
很多年前,当我还是高中生的时候,我曾考虑以小说作家作为我的职业追求,我订阅了一本 Writer's 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 指向目标
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
can() 方法可让您确定所提供的私仆实现是否满足需求。清单 3 中的 ServiceLoader 的 IPersonalServant 列表基本上满足需求:
清单 3. IPersonalServant 行吗?
假设有此接口的实现,如清单 4:
清单 4. Jeeves 实现了 IPersonalServant
剩下的就是配置包含实现的 JAR 文件,让 ServiceLoader 能识别 — 这可能会非常棘手。JDK 想要 JAR 文件有一个 META-INF/services 目录,它包含一个文本文件,其文件名与接口类名完全匹配 — 本例中是 META-INF/services/IPersonalServant。接口类名的内容是实现的名称,每行一个,如清单 5:
清单 5. META-INF/services/IPersonalServant
幸运的是,Ant 构建系统(自 1.7.0 以来)包含一个对 jar 任务的服务标签,让这相对容易,见清单 6:
清单 6. Ant 构建的 IPersonalServant
这里,很容易调用 IPersonalServant,让它执行命令。然而,解析和执行这些命令可能会非常棘手。这又是另一个 “小线头”。
--------------------------------------------------------------------------------
3. Scanner
有无数 Java 工具能帮助您构建解析器,很多函数语言已成功构建解析器函数库(解析器选择器)。但如果要解析的是逗号分隔值文件,或空格分隔文本文件,又怎么办呢?大多数工具用在此处就过于隆重了,而 String.split() 又不够。(对于正则表达式,请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。”)
Java 平台的 Scanner 类会是这些类中您最好的选择。以轻量级文本解析器为目标,Scanner 提供了一个相对简单的 API,用于提取结构化文本,并放入强类型的部分。想象一下,如果您愿意,一组类似 DSL 的命令(源自 Terry Pratchett Discworld 小说)排列在文本文件中,如清单 7:
清单 7. Igor 的任务
您,或者是本例中称为 Igor的私仆,能轻松使用 Scanner 解析这组违法命令,如清单 8 所示:
清单 8. Igor 的任务,由 Scanner 解析
假设 Igor 已在 ServantLoader 中注册,可以很方便地将 can() 调用改得更实用,并重用前面的 Servant 代码,如清单 9 所示:
清单 9. Igor 做了什么
真正 DSL 实现显然不会仅仅打印到标准输出流。我把追踪哪些部分、跟随哪些部分的细节留待给您(当然,还有忠诚的 Igor)。
--------------------------------------------------------------------------------
4. Timer
java.util.Timer 和 TimerTask 类提供了方便、相对简单的方法可在定期或一次性延迟的基础上执行任务:
清单 10. 稍后执行
Timer 有许多 schedule() 重载,它们提示某一任务是一次性还是重复的,并且有一个启动的 TimerTask 实例。TimerTask 实际上是一个 Runnable(事实上,它实现了它),但还有另外两个方法:cancel() 用来取消任务,scheduledExecutionTime() 用来返回任务何时启动的近似值。
请注意 Timer 却创建了一个非守护线程在后台启动任务,因此在清单 10 中我需要调用 System.exit() 来取消任务。在长时间运行的程序中,最好创建一个 Timer 守护线程(使用带有指示守护线程状态的参数的构造函数),从而它不会让 VM 活动。
这个类没什么神奇的,但它确实能帮助我们对后台启动的程序的目的了解得更清楚。它还能节省一些 Thread 代码,并作为轻量级 ScheduledExecutorService(对于还没准备好了解整个 java.util.concurrent 包的人来说)。
--------------------------------------------------------------------------------
5. JavaSound
尽管在服务器端应用程序中不常出现,但 sound 对管理员有着有用的 “被动” 意义 — 它是恶作剧的好材料。尽管它很晚才出现在 Java 平台中,JavaSound API 最终还是加入了核心运行时库,封装在 javax.sound * 包 — 其中一个包是 MIDI 文件,另一个是音频文件示例(如普遍的 .WAV 文件格式)。
JavaSound 的 “hello world” 是播放一个片段,如清单 11 所示:
清单 11. 再放一遍,Sam
大多数还是相当简单(至少 JavaSound 一样简单)。第一步是创建一个文件的 AudioInputStream 来播放。为了让此方法尽量与上下文无关,我们从加载类的 ClassLoader 中抓取文件作为 InputStream。(AudioSystem 还需要一个 File 或 String,如果提前知道声音文件的具体路径。)一旦完成, DataLine.Info 对象就提供给 AudioSystem,得到一个 Clip,这是播放音频片段最简单的方法。(其他方法提供了对片段更多的控制 — 例如获取一个 SourceDataLine — 但对于 “播放” 来说,过于复杂)。
这里应该和对 AudioInputStream 调用 open() 一样简单。(“应该” 的意思是如果您没遇到下节描述的错误。)调用 start() 开始播放,drain() 等待播放完成,close() 释放音频线路。播放是在单独的线程进行,因此调用 stop() 将会停止播放,然后调用 start() 将会从播放暂停的地方重新开始;使用 setFramePosition(0) 重新定位到开始。
没声音?
JDK 5 发行版中有个讨厌的小错误:在有些平台上,对于一些短的音频片段,代码看上去运行正常,但就是 ... 没声音。显然媒体播放器在应该出现的位置之前触发了 STOP 事件。(见 参考资料 一节中错误页的链接。)
这个错误 “无法修复”,但解决方法相当简单:注册一个 LineListener 来监听 STOP 事件,当触发时,调用片段对象的 notifyAll()。然后在 “调用者” 代码中,通过调用 wait() 等待片段完成(还调用 notifyAll())。在没出现错误的平台上,这些错误是多余的,在 Windows® 及有些 Linux® 版本上,会让程序员 “开心” 或 “愤怒”。
--------------------------------------------------------------------------------
结束语
现在您都了解了,厨房里的工具。我知道很多人已清楚了解我此处介绍的工具,而我的职业经验告诉我,很多人将从这篇介绍文章,或者说是对长期遗忘在凌乱的抽屉中的小工具的提示中受益。
我在此系列中做个简短的中断,让别人能加入分享他们各自领域的专业经验。但别担心,我还会回来的,无论是本系列还是探索其他领域的新的 5 件事。在那之前,我鼓励您一直探索 Java 平台,去发现那些能让编程更高效的宝石。
转载自:http://www.ibm.com/developerworks/cn/java/j-5things12/
很多年前,当我还是高中生的时候,我曾考虑以小说作家作为我的职业追求,我订阅了一本 Writer's 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<IPersonalServant> 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
<target name="serviceloader" depends="build"> <jar destfile="misc.jar" basedir="./classes"> <service type="IPersonalServant"> <provider classname="Jeeves" /> </service> </jar> </target>
这里,很容易调用 IPersonalServant,让它执行命令。然而,解析和执行这些命令可能会非常棘手。这又是另一个 “小线头”。
--------------------------------------------------------------------------------
3. Scanner
有无数 Java 工具能帮助您构建解析器,很多函数语言已成功构建解析器函数库(解析器选择器)。但如果要解析的是逗号分隔值文件,或空格分隔文本文件,又怎么办呢?大多数工具用在此处就过于隆重了,而 String.split() 又不够。(对于正则表达式,请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。”)
Java 平台的 Scanner 类会是这些类中您最好的选择。以轻量级文本解析器为目标,Scanner 提供了一个相对简单的 API,用于提取结构化文本,并放入强类型的部分。想象一下,如果您愿意,一组类似 DSL 的命令(源自 Terry Pratchett Discworld 小说)排列在文本文件中,如清单 7:
清单 7. Igor 的任务
fetch 1 head fetch 3 eye fetch 1 foot attach foot to head attach eye to head admire
您,或者是本例中称为 Igor的私仆,能轻松使用 Scanner 解析这组违法命令,如清单 8 所示:
清单 8. Igor 的任务,由 Scanner 解析
import java.io.*; import java.util.*; public class Igor implements IPersonalServant { public boolean can(String cmd) { if (cmd.equals("fetch body parts")) return true; if (cmd.equals("attach body parts")) return true; else return false; } public void process(File commandFile) throws FileNotFoundException { Scanner scanner = new Scanner(commandFile); // Commands come in a verb/number/noun or verb form while (scanner.hasNext()) { String verb = scanner.next(); if (verb.equals("fetch")) { int num = scanner.nextInt(); String type = scanner.next(); fetch (num, type); } else if (verb.equals("attach")) { String item = scanner.next(); String to = scanner.next(); String target = scanner.next(); attach(item, target); } else if (verb.equals("admire")) { admire(); } else { System.out.println("I don't know how to " + verb + ", marthter."); } } } public void fetch(int number, String type) { if (parts.get(type) == null) { System.out.println("Fetching " + number + " " + type + (number > 1 ? "s" : "") + ", marthter!"); parts.put(type, number); } else { System.out.println("Fetching " + number + " more " + type + (number > 1 ? "s" : "") + ", marthter!"); Integer currentTotal = parts.get(type); parts.put(type, currentTotal + number); } System.out.println("We now have " + parts.toString()); } public void attach(String item, String target) { System.out.println("Attaching the " + item + " to the " + target + ", marthter!"); } public void admire() { System.out.println("It'th quite the creathion, marthter"); } private Map<String, Integer> parts = new HashMap<String, Integer>(); }
假设 Igor 已在 ServantLoader 中注册,可以很方便地将 can() 调用改得更实用,并重用前面的 Servant 代码,如清单 9 所示:
清单 9. Igor 做了什么
import java.io.*; import java.util.*; public class Servant { public static void main(String[] args) throws IOException { ServiceLoader<IPersonalServant> servantLoader = ServiceLoader.load(IPersonalServant.class); IPersonalServant i = null; for (IPersonalServant ii : servantLoader) if (ii.can("fetch body parts")) i = ii; if (i == null) throw new IllegalArgumentException("No suitable servant found"); for (String arg : args) { i.process(new File(arg)); } } }
真正 DSL 实现显然不会仅仅打印到标准输出流。我把追踪哪些部分、跟随哪些部分的细节留待给您(当然,还有忠诚的 Igor)。
--------------------------------------------------------------------------------
4. Timer
java.util.Timer 和 TimerTask 类提供了方便、相对简单的方法可在定期或一次性延迟的基础上执行任务:
清单 10. 稍后执行
import java.util.*; public class Later { public static void main(String[] args) { Timer t = new Timer("TimerThread"); t.schedule(new TimerTask() { public void run() { System.out.println("This is later"); System.exit(0); } }, 1 * 1000); System.out.println("Exiting main()"); } }
Timer 有许多 schedule() 重载,它们提示某一任务是一次性还是重复的,并且有一个启动的 TimerTask 实例。TimerTask 实际上是一个 Runnable(事实上,它实现了它),但还有另外两个方法:cancel() 用来取消任务,scheduledExecutionTime() 用来返回任务何时启动的近似值。
请注意 Timer 却创建了一个非守护线程在后台启动任务,因此在清单 10 中我需要调用 System.exit() 来取消任务。在长时间运行的程序中,最好创建一个 Timer 守护线程(使用带有指示守护线程状态的参数的构造函数),从而它不会让 VM 活动。
这个类没什么神奇的,但它确实能帮助我们对后台启动的程序的目的了解得更清楚。它还能节省一些 Thread 代码,并作为轻量级 ScheduledExecutorService(对于还没准备好了解整个 java.util.concurrent 包的人来说)。
--------------------------------------------------------------------------------
5. JavaSound
尽管在服务器端应用程序中不常出现,但 sound 对管理员有着有用的 “被动” 意义 — 它是恶作剧的好材料。尽管它很晚才出现在 Java 平台中,JavaSound API 最终还是加入了核心运行时库,封装在 javax.sound * 包 — 其中一个包是 MIDI 文件,另一个是音频文件示例(如普遍的 .WAV 文件格式)。
JavaSound 的 “hello world” 是播放一个片段,如清单 11 所示:
清单 11. 再放一遍,Sam
public static void playClip(String audioFile) { try { AudioInputStream inputStream = AudioSystem.getAudioInputStream( this.getClass().getResourceAsStream(audioFile)); DataLine.Info info = new DataLine.Info( Clip.class, audioInputStream.getFormat() ); Clip clip = (Clip) AudioSystem.getLine(info); clip.addLineListener(new LineListener() { public void update(LineEvent e) { if (e.getType() == LineEvent.Type.STOP) { synchronized(clip) { clip.notify(); } } } }); clip.open(audioInputStream); clip.setFramePosition(0); clip.start(); synchronized (clip) { clip.wait(); } clip.drain(); clip.close(); } catch (Exception ex) { ex.printStackTrace(); } }
大多数还是相当简单(至少 JavaSound 一样简单)。第一步是创建一个文件的 AudioInputStream 来播放。为了让此方法尽量与上下文无关,我们从加载类的 ClassLoader 中抓取文件作为 InputStream。(AudioSystem 还需要一个 File 或 String,如果提前知道声音文件的具体路径。)一旦完成, DataLine.Info 对象就提供给 AudioSystem,得到一个 Clip,这是播放音频片段最简单的方法。(其他方法提供了对片段更多的控制 — 例如获取一个 SourceDataLine — 但对于 “播放” 来说,过于复杂)。
这里应该和对 AudioInputStream 调用 open() 一样简单。(“应该” 的意思是如果您没遇到下节描述的错误。)调用 start() 开始播放,drain() 等待播放完成,close() 释放音频线路。播放是在单独的线程进行,因此调用 stop() 将会停止播放,然后调用 start() 将会从播放暂停的地方重新开始;使用 setFramePosition(0) 重新定位到开始。
没声音?
JDK 5 发行版中有个讨厌的小错误:在有些平台上,对于一些短的音频片段,代码看上去运行正常,但就是 ... 没声音。显然媒体播放器在应该出现的位置之前触发了 STOP 事件。(见 参考资料 一节中错误页的链接。)
这个错误 “无法修复”,但解决方法相当简单:注册一个 LineListener 来监听 STOP 事件,当触发时,调用片段对象的 notifyAll()。然后在 “调用者” 代码中,通过调用 wait() 等待片段完成(还调用 notifyAll())。在没出现错误的平台上,这些错误是多余的,在 Windows® 及有些 Linux® 版本上,会让程序员 “开心” 或 “愤怒”。
--------------------------------------------------------------------------------
结束语
现在您都了解了,厨房里的工具。我知道很多人已清楚了解我此处介绍的工具,而我的职业经验告诉我,很多人将从这篇介绍文章,或者说是对长期遗忘在凌乱的抽屉中的小工具的提示中受益。
我在此系列中做个简短的中断,让别人能加入分享他们各自领域的专业经验。但别担心,我还会回来的,无论是本系列还是探索其他领域的新的 5 件事。在那之前,我鼓励您一直探索 Java 平台,去发现那些能让编程更高效的宝石。
转载自:http://www.ibm.com/developerworks/cn/java/j-5things12/
发表评论
-
巧用JDK自带工具Jstat查看Gc垃圾回收之使用方法
2012-07-19 09:40 3915如何查看JVM中内存使用情况如何? JVM垃圾回收是否正常? ... -
遍历Map的三种常用方法 java
2011-11-09 12:06 28861、一般的map定义: Map<Key, Object& ... -
程序变量命名的几条法则:匈牙利命名法,驼峰式大小写,帕斯卡命名法
2011-09-07 17:54 51301.匈牙利命名法的好处: ... -
JDK源码中对当前时间的一些用法
2011-09-05 14:51 1079JDK源码中对当前时间的一些用法: String[] ... -
Eclipse安装反编译工具查看Jar包源码 JD Eclipse插件
2011-08-24 10:37 5089如何在Eclipse中安装反编译工具查看Jar包源码呢? 打 ... -
Struts2图片上传成功后,异常:java.lang.IllegalStateException
2011-07-10 18:49 19481.场景: 使用Struts2图片上传成功后出现异常: ... -
J2EE表生成器@TableGenerator
2011-03-31 14:29 1725最近工作中遇到了许多 ... -
Spring Hibernate Extjs开发指南
2011-03-23 18:08 981从学习到找工作,然后再面试,最后才经历上班; 从这段时间对自 ... -
获取当前时间的前三个月 java
2011-03-17 11:14 4742获取当前时间的前三个月: Date date = n ... -
java 线程的状态与控制
2010-12-16 20:54 1122一、线程的状态 线程的主要状态有: 1.新 ... -
MyEclipse Blue 6.5 注册码 可到2013年12月
2010-12-06 09:44 1520做Java软件开发的,首选的软件工具莫非是MyEclip ... -
关于 Java Collections API 您不知道的 5 件事,第 2 部分
2010-10-24 00:28 524简介: 您可以在任何地方使用 Java™ 集合,但是一定要小心 ... -
关于 JVM 命令行标志您不知道的 5 件事
2010-10-24 00:22 764简介: Java™ 虚拟机有数百个命令行选项,被经验丰富的开发 ... -
关于 Java Database Connectivity 您不知道的 5 件事
2010-10-24 00:21 501简介: JDBC,即 Java™ Database Conne ... -
关于 Java Scripting API 您不知道的 5 件事
2010-10-24 00:17 580简介: Java™ 语言足以满足您的一些项目的需求,但是脚本语 ... -
关于 Java 性能监控您不知道的 5 件事,第 2 部分
2010-10-24 00:15 565简介: 如果 JDK 中配置有全功能分析器 JConsole ... -
关于 Java 性能监控您不知道的 5 件事,第 1 部分
2010-10-24 00:13 758简介: 责怪糟糕的代码 ... -
关于 JAR 您不知道的 5 件事
2010-10-24 00:11 403简介: 除了一些基础的 JAR 之外,许多 Java™ 开发人 ... -
关于 java.util.concurrent 您不知道的 5 件事,第 2 部分
2010-10-24 00:05 482简介: 除了具有很好的并发性的 Collections,jav ... -
关于 java.util.concurrent 您不知道的 5 件事,第 1 部分
2010-10-24 00:02 490简介: 编写能够良好执行,防止应用程序受损的多线程代码是很艰巨 ...
相关推荐
"Java常用工具类大全,工作5年精心整理.zip"这个压缩包文件很可能包含了一位有经验的Java开发者在五年工作中积累的各种实用工具类,这些工具类能够极大地提高开发效率,简化代码编写。以下是对可能包含的知识点进行...
以下是对"一些java常用的工具类"的详细说明。 首先,工具类通常包含静态方法,这些方法不依赖于类的实例,可以直接调用,减少了对象创建的开销。这些类通常以“Utils”或“Helper”结尾,如Apache Commons Lang中的...
"java常用工具类"这个主题涵盖了Java开发中常用的类和方法,这些工具类可以帮助我们简化编程工作,提高代码的可读性和可维护性。在Java中,`java.util`包就是这样一个包含大量工具类的包,提供了很多实用的功能。 1...
Java常用工具类是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,最著名的工具类库是`java.util`包,它包含了大量实用类,如集合、日期时间、数学计算、...
以上是Java中28个常用工具类的简要介绍,每个类都有丰富的功能,掌握并灵活运用它们,将极大提升你的Java编程能力。在实际开发中,根据具体需求选择合适的工具类,可以编写出高效、简洁的代码。
Java工具类是Java编程中非常重要的组成部分,它们提供了一系列预定义的方法,可以帮助开发者高效地处理各种常见任务,而无需从头实现。在Java中,最知名的工具类库是`java.util`包,它包含了大量方便实用的类。下面...
提供了很丰富的java工具类,包括字符串、数字、日期、文件、图像、编码解码、校验工具、文档操作等。 主要分为以下几种: - 1.通用操作类,例如String、数字、日期、各种校验等 - 2.文档操作,excel、pdf等 - 3.加密...
"Java常用工具类包"是一个集合,它包含了多种针对不同场景的工具类,如文件操作、文本处理、对象转换等。下面将详细介绍这些工具类的主要功能及其应用场景。 1. **文件对比**: - Java中的`java.io.File`类可以...
这些工具类和API是Java开发中不可或缺的部分,掌握它们能显著提高开发效率并确保代码的健壮性。在实际项目中,开发者往往需要根据具体需求选择合适的工具类进行组合使用,以实现特定功能。通过深入理解并熟练运用...
提供了很丰富的java工具类,包括字符串、数字、日期、文件、图像、编码解码、校验工具、文档操作等。 主要分为以下几种: - 1.通用操作类,例如String、数字、日期、各种校验等 - 2.文档操作,excel、pdf等 - 3.加密...
"java常用工具类整理"这个主题涵盖了Java开发中常用的工具类,这些类在日常编程中非常实用,能大大提高开发效率。这里我们将深入探讨一些常见的Java工具类,并结合`com-jarvis-base`这个文件名,推测这是一个基础...
并且在平时开发中会遇到各种各样通用的一些功能,比如对json的处理,对String对象的处理,对Excel文件的处理,MD5加密处理,Bean对象处理等等,这些常用并通用的方法可以被封装成一个个工具类如StringUtil,...
精心整理的26个java常用工具类,如:FastJsonUtil,StringHelper,RandomHelper,FileHelper,HttpClientHelper等等,直接使用maven导入到eclipse中使用即可。
java 常用工具源码,多年工作积累,源码分享。 工作中多年积累常用工具,log封装,日期类,多线程操作,字符串处理,邮件发送,http工具类,页面处理,汉字拼音,ftp ,md5, secret,ValidatorStringEx,Xml类。
主要包含的工具: 1、敏感字的过滤 2、文件的各种操作 3、图片的验证码,图片裁剪 4、获取客户端的ip 5、md5加密,加密解密 6、对象的clone 7、获取操作系统的版本 8、String的操作 9、Date的操作 10、...
提供了很丰富的java工具类,包括字符串、数字、日期、文件、图像、编码解码、校验工具、文档操作等。 主要分为以下几种: - 1.通用操作类,例如String、数字、日期、各种校验等 - 2.文档操作,excel、pdf等 - 3.加密...