J2SE
【Java基础专题】IO与文件读写---优化搜索程序(01)
摘要: Apache commons CLI是一个开源的,用于处理命令行的工具包。这个包目前的稳定版本是1.2,他非常简单只有20个左右的class,但提供了几乎所以可以用到的命令行功能。它的主页在这里:Apache commons CLI
根据CLI的逻辑,每一个命令行的处理都可以分为3个步骤:定义、解析、交互
①定义:定义命令行的各种选项属性(包括缩写、全写、是否必须、是否带参数、参数个数限制)
②解析:使用解析器对命令行选项列表进行解析
③交互:从解析好的命令行查询用户输入的参数值并进行处理
阅读全文
posted @
2010-04-02 14:20 Paul Lin 阅读(1062) |
评论 (0) 编辑
【Java基础专题】IO与文件读写---DirectoryWalker和FileFilter的复杂条件使用
摘要: 1.基本功能过滤器
=============================================
①类型:DirectoryFileFilter、FileFileFilter
②大小:EmptyFileFilter、SizeFileFilter
③时间:AgeFileFilter
④名称:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
⑤读写属性:CanReadFileFilter、CanWriteFileFilter
⑥隐藏属性:HiddenFileFilter
2.逻辑关系过滤器
=============================================
①逻辑与:AndFileFilter
②逻辑或:OrFileFilter
③逻辑非:NotFileFilter
④永真/假:TrueFileFilter、FalseFil
阅读全文
posted @
2010-04-01 17:52 Paul Lin 阅读(3159) |
评论 (1) 编辑
【Java基础专题】IO与文件读写---使用DirectoryWalker和FileFilterUtils进行搜索
摘要: Apache commons IO包中提供了一个可以遍历目录下资源的DirectoryWalker,还有很多的IOFileFilter用于过滤文件目录。下面的例子分别演示了这个功能。
这两个搜索类都是以内部类的方式嵌入客户端的,客户端接收客户的参数,然后通过一个后台线程来进行搜索,等待子线程完成搜索后(join方法),再打印搜索结果。
注意这个过程是可以被cancel的。cancel主要有2种情况。外部cancel:外部线程通过调用内部类的cancel()方法。内部cancel:在handleDirectory、handleFile中主动抛出CancelException。
walk方法在每次执行前、后都会检查当前是否有cancel指令发出(checkIfCancelled ---> handleIsCancelled),如果有那么默认立刻抛出CancelException,然后调用handleCancelled方法。
阅读全文
posted @
2010-03-31 23:45 Paul Lin 阅读(2556) |
评论 (1) 编辑
【Java基础专题】IO与文件读写---对同步/异步和阻塞/非阻塞的理解
摘要: ①同步的操作,如果在等待的过程不能做别的事情,它是同步+阻塞的。这个也是最常见的
②同步的操作,如果在等待的过程可以做别的事情,它是同步+非阻塞的。
③异步的操作,如果在等待的过程不能做别的事情,它是异步+阻塞的。
④异步的操作,如果在等待的过程可以做别的事情,它是异步+非阻塞的。这个也是最常见的
阅读全文
posted @
2010-03-10 15:36 Paul Lin 阅读(2777) |
评论 (2) 编辑
【Java基础专题】IO与文件读写---同步/异步与阻塞/非阻塞的区别(转)
摘要: 同步/异步:消息通知机制。是自己主动关注消息还是靠别人通知
阻塞/非阻塞:消息处理机制。等待消息处理完成的过程能否做别的事情
阅读全文
posted @
2010-03-10 14:54 Paul Lin 阅读(2621) |
评论 (0) 编辑
【Java基础专题】IO与文件读写---使用Apache commons IO包进行资源遍历
摘要: 要使用DirectoryWalker来遍历一个目录并进行相应的操作,步骤如下:
①创建一个继续于DirectoryWalker的类,并在构造方法中调用super();
②定义一个业务入口方法,例如clean。在这个方法中调用walk方法
③覆盖DirectoryWalker类的handleDirectory方法,提供相应的处理逻辑
④覆盖DirectoryWalker类的handleFile方法,提供相应的处理逻辑
阅读全文
posted @
2010-03-09 00:26 Paul Lin 阅读(3507) |
评论 (1) 编辑
【Java基础专题】IO与文件读写---使用Apache commons IO过滤文件和目录
摘要: 它们可以分为两大类:
①实质性过滤器:例如针对文件的类型,属性,名称,大小进行过滤的过滤器
②过滤器连接器:典型的包括AndFileFilter、OrFileFilter。用于逻辑连接多个过滤器
阅读全文
posted @
2010-03-09 00:02 Paul Lin 阅读(1345) |
评论 (0) 编辑
【Java基础专题】IO与文件读写---使用Apache commons IO简化文件读写
摘要: FileUtils总体上来说,主要功能有:
※ 资源的创建、删除
※ 资源的复制、移动
※ 资源的读写
※ 资源的比较
※ 资源的过滤
※ 资源的转换
阅读全文
posted @
2010-03-08 15:07 Paul Lin 阅读(6563) |
评论 (1) 编辑
【Java基础专题】IO与文件读写---使用Apache commons io包提高读写效率
摘要: 本文通过对Apache commons io包的input,output子类的源代码研究,来揭示为什么使用commons IO包会在性能上由于JDK自带的IO类。
特别是输出流方面
阅读全文
posted @
2010-03-04 10:28 Paul Lin 阅读(5636) |
评论 (0) 编辑
【Java基础专题】IO与文件读写---Java的IO流架构
摘要: 使用图例全面展示Java中IO的架构,特别是节点流和过滤流及其之间的转换
阅读全文
posted @
2010-03-02 09:47 Paul Lin 阅读(4301) |
评论 (3) 编辑
【Java基础专题】编码与乱码(08)---JavaEE防止中文乱码的设置
摘要: 良好的编程习惯,对编码和数据传输流程的清晰认识,规范的配置是确保JavaEE应用不会出现乱码的三大法宝
阅读全文
posted @
2010-02-24 10:25 Paul Lin 阅读(4301) |
评论 (1) 编辑
【Java基础专题】编码与乱码(07)---native2ascii命令的用法
摘要: 可以看到该命令对于英文字符,数字不会转换而是直接输出,而对于每个中文字符则转换成以\u开头的4个16进制数字。
通常情况下,如果要进行字符的逆转换,-encoding encoding_name这个参数都会配合-reverse出现。在上面的例子中因为本地系统是中文操作系统,所以即便没有指定-encoding也可以正确地从unicode ---》GBK。如果是在英文平台下由于默认字符集是ISO-8859-1,那么这个时候如果不指定则转换出来的将是?了。
阅读全文
posted @
2010-02-23 18:41 Paul Lin 阅读(868) |
评论 (0) 编辑
【Java基础专题】编码与乱码(06)---字符的各种值转换
摘要: 可以看到在Java中,字符的unicode有两种表示显示:一种是10进制形式,一种是16进制形式。它们可以分别通过:int i = (int)(string.charAt(i))和Integer.toHexString(i);获得。而且在java文件和Web页面,同一个unicode的表示形式是不同。web页面需要用进行转义,在java文件中则使用\u进行转义。
阅读全文
posted @
2010-02-23 16:48 Paul Lin 阅读(2118) |
评论 (2) 编辑
【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换
摘要: 在这个专题的第一篇文章【Java基础专题】编码与乱码(01)---编码基础 开头,我们就已经介绍了这个规则:
①得到每个字符的2进制GBK编码
②将该16进制的GBK编码转换成2进制的字符串(2个字节)
③分别在字符串的首位插入110,在第9位插入10,在第17位插入10三个字符串,得到3个字节
④将这3个字节分别转换成16进制编码,得到最终的UTF-8编码。
阅读全文
posted @
2010-02-22 23:00 Paul Lin 阅读(36956) |
评论 (11) 编辑
【Java基础专题】编码与乱码(04)---输出时的编码与乱码
摘要: 谨慎地使用getBytes(NAME_OF_CHARSET)和new String(bytes, NAME_OF_CHARSET),除非你很清楚的知道原始的字符编码和传输协议使用的编码。
推荐使用基于服务器的配置、过滤器设置request/response的characterEncoding、content type属性。还有就是JSP页面的pageEncoding属性、HTML meta元素的content type属性。尽量避免频繁的在代码中进行字符串转码,即降低了效率又增加了风险
阅读全文
posted @
2010-02-22 17:39 Paul Lin 阅读(3029) |
评论 (4) 编辑
【Java基础专题】编码与乱码(03)----String的toCharArray()方法
摘要: 这个方法再次证明了String的getBytes()方法的危险性,如果我们使用new String(str.getBytes(), encoding)对字符串进行重新编码解码时,我们一定要清楚str.getBytes()方法返回的字节数组的长度、内容到底是什么,因为在接下来使用新的encoding进行编码解码时,Java并不会自动地对字节数组进行扩展以适应新的encoding。而是按照新的编码方法直接对该字节数组进行解析。
于是结果就像上面的例子一样,同样是4个原始字节,有些每2个一组进行解析,有些每个一组进行解析,有些每3个一组进行解析。其结果就只能看那种编码方式合适了。
阅读全文
posted @
2010-02-22 17:18 Paul Lin 阅读(7077) |
评论 (2) 编辑
【Java基础专题】编码与乱码(02)---String的getBytes([encoding])方法
摘要: 不要轻易地使用或滥用String类的getBytes(encoding)方法,更要尽量避免使用getBytes()方法。因为这个方法是平台依赖的,在平台不可预知的情况下完全可能得到不同的结果。如果一定要进行字节编码,则用户要确保encoding的方法就是当初字符串输入时的encoding。
阅读全文
posted @
2010-02-22 16:53 Paul Lin 阅读(4578) |
评论 (1) 编辑
【Java基础专题】编码与乱码(01)---编码基础
摘要: Unicode到UTF-8的转换:Unicode的16进制编码<-->对应的2进制编码<-->UTF-8规范的2进制编码<-->UTF-8规范的16进制编码
也就是说,假如我们需要从磁盘文件、数据库记录、网络传输一些字符,保存到Java的变量中,要经历由bytes-->encode字符-->Unicode字符的转换(例如new String(bytes, encode));而要把Java变量保存到文件、数据库或者通过网络传输,系统要做一个Unicode字符-->encode字符-->bytes的转换(例如String.getBytes([encode]))
阅读全文
posted @
2010-02-16 23:23 Paul Lin 阅读(3661) |
评论 (3) 编辑
【原】RSS工具开发手记(14)---Informa的exporters包
摘要: Informa不仅提供了对不同版本的RSS Feed source的读入和解析,同样也提供了将channel object导出为不同协议版本的XML文件的功能。这个功能是通过exporters包下的各个导出类来完成的。目前仅支持对RSS协议的导出,不支持Atom协议、OPML协议的导出。
阅读全文
posted @
2010-01-04 10:15 Paul Lin 阅读(397) |
评论 (0) 编辑
【原】RSS工具开发手记(13)---Informa的parsers包
摘要: OPML(Outline Processor Markup Language)协议正是用于解决这样问题的。利用OPML协议,我们可以通过阅读器把已经订阅的频道导出为OPML协议规定的格式,从而作为
一个文件分享出去。
阅读全文
posted @
2010-01-02 20:56 Paul Lin 阅读(336) |
评论 (0) 编辑
【原】RSS工具开发手记(12)---Informa的parsers包
摘要: 可以看到,对于这个解析过程,一般的步骤就是:
A.获取channnel下的某个子节点元素
B.如果该子节点元素有子元素或属性,则继续递归访问
C.调用该channnel子元素的createXxx方法加载或创建该子元素
D.调用Channel的setXxx方法添加该子元素到channel实例中
阅读全文
posted @
2009-12-30 10:45 Paul Lin 阅读(243) |
评论 (0) 编辑
【原】RSS工具开发手记(11)---Informa的parse包
摘要: FeedParser是一个facade类,这个类的工作就是根据读入的RSS Feed的协议系和版本“委托(delegate)”给已经硬编码的规则(concrete rules)指定的解析器,而且这些解析器是私有的。这意味着:用户不能直接调用一个RSS_0_91_Parser类的实例来进行解析工作。
阅读全文
posted @
2009-12-29 15:56 Paul Lin 阅读(1471) |
评论 (0) 编辑
【原】RSS工具开发手记(10)---Informa的impl.hibernate包
摘要: ChannelBuilder对channel object的创建原则就是:
A.如果能够从持久层中找到对应的记录,那么从持久层返回
B.如果找不到,则创建它并持久化它,然后返回该对象(已持久化)
只要记得的一点就是:从ChannelBuilder返回的对象都是已经持久化的。
阅读全文
posted @
2009-12-28 15:57 Paul Lin 阅读(1230) |
评论 (0) 编辑
【原】RSS工具开发手记(07)---Informa的impl.basic包
摘要: 这个ID生成类采用了系统当前时间作为随即数产生的种子,这个并不难理解。但是有一个地方需要我们注意的就是关键字transient的使用。这个关键的作用是告诉编译器假设该类的对象被序列化了,这个值不需要被保存。因为它是“瞬时”的。
阅读全文
posted @
2009-12-23 00:03 Paul Lin 阅读(1328) |
评论 (0) 编辑
【原】RSS工具开发手记(05)---Informa的impl.basic包
摘要: 总结起来,channel的创建,更新过程如下:
①接收经过ChannelParser解析后的XML Element元素,和其他一系列属性,调用构造方法
②构造方法为channel生成一个全局唯一ID
③构造方法创建item列表,观察者列表,设置好分类(Category),首次更新时间
④如果有新item到来,则添加到item列表,同时更新item的channel归属
⑤如果现有channel更新,则设置最新更新时间
⑥通知每一个已注册的观察者有事件发生
阅读全文
posted @
2009-12-22 23:31 Paul Lin 阅读(1247) |
评论 (0) 编辑
【原】RSS工具开发手记(04)---Informa的core包
摘要: Informa的core包介绍如下:
“This package contains interfaces for the news channel objects, it builds the core API for all news channel storage implementation. ”
从上面这句话来看,core包里面定义的都是关于“news channel objects”的接口---实际上就是RSS协议中的channel和item元素。经过一个多小时查看源代码和阅读API,发现Informa对core包的设计有如下特点:
core包中的元素被分为标记接口、实体接口、行为接口
阅读全文
posted @
2009-12-21 22:09 Paul Lin 阅读(1236) |
评论 (0) 编辑
【原】RSS工具开发手记(03)---初始Informa
摘要: Informa的API结构如下:
★core包:
核心包。订阅了RSS中channel,item等一系列元素和元数据的接口
★impl.basic包:
基本功能包。使用in-memory模式实现了core包订阅的接口
★impl.hibernate包:
基于hibernate实现的包,使用关系型数据库模式实现了core包定义的接口
★parsers包:
定义了永远解析channel,item的解析器工具
★exporters包:
定义了一组把channel,item导出成各种协议格式的工具
★search包:
定义了用于全文搜索channel,item的工具
★utils.manager.memory包:
定义了一组用于管理“in-memory”模式持久化的工具
★utils.manager.hibernate包:
阅读全文
posted @
2009-12-21 15:39 Paul Lin 阅读(1249) |
评论 (0) 编辑
【原】RSS工具开发手记(02)---工欲善其事,必先利其器
摘要: 选择一个开源框架,我的标准有几条:
★良好的文档和源代码管理:这是最基本的一条,想RSSLibJ这种连文档、官网都没有的一律pass掉
★持续的改进:这是第二个重要的,像上面某些工具从02年后就不再更新了,出了问题你找谁诉苦去
★简单和易上手:在短时间内可以迅速依样画葫芦
★活跃的社区:参与的人越多软件成长得越多。我不是特别在乎软件目前的使用率,因为好的软件都是慢慢出名的
阅读全文
posted @
2009-12-21 11:52 Paul Lin 阅读(1350) |
评论 (0) 编辑
【原】Java 多线程 之 ThreadLocal
摘要: ThreadLocal作用解析及代码实例
阅读全文
posted @
2008-09-05 17:10 Paul Lin 阅读(4748) |
评论 (1) 编辑
【原】多线程编程的基础知识点
摘要: 【一】进程、线程、并发执行
【二】JVM与多线程
【三】Java语言对多线程的支持
【四】线程的状态切换
【五】Java中线程的调度API
【六】参考文章
阅读全文
posted @
2008-09-02 10:50 Paul Lin 阅读(3898) |
评论 (3) 编辑
【转】Dom4j中自带的教程
摘要: 来自Dom4j中的cookbook
阅读全文
posted @
2008-01-30 17:13 Paul Lin 阅读(2229) |
评论 (0) 编辑