posts - 262,  comments - 221,  trackbacks - 0
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包规范文件名  阅读全文
posted @ 2010-03-08 10:56 Paul Lin 阅读(844) | 评论 (0)  编辑
【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)  编辑
【原】Java Reflection 之 Array      摘要: Java反射之Array  阅读全文
posted @ 2008-09-04 15:13 Paul Lin 阅读(1137) | 评论 (0)  编辑
【原】Java Reflection 之 Filed      摘要: Java反射之Filed  阅读全文
posted @ 2008-09-04 15:02 Paul Lin 阅读(401) | 评论 (0)  编辑
【原】Java Reflection 之 Method      摘要: Java反射之Method  阅读全文
posted @ 2008-09-03 16:05 Paul Lin 阅读(1818) | 评论 (0)  编辑
【原】Java Reflection 之 Class      摘要: Java反射之Class  阅读全文
posted @ 2008-09-03 14:36 Paul Lin 阅读(338) | 评论 (0)  编辑
【原】多线程编程的基础知识点      摘要: 【一】进程、线程、并发执行
【二】JVM与多线程
【三】Java语言对多线程的支持
【四】线程的状态切换
【五】Java中线程的调度API
【六】参考文章  阅读全文
posted @ 2008-09-02 10:50 Paul Lin 阅读(3898) | 评论 (3)  编辑
【半转载】一个不错的多线程Socket服务器简单例子      摘要: 多线程池化Socket服务器  阅读全文
posted @ 2008-08-16 23:08 Paul Lin 阅读(7258) | 评论 (0)  编辑
【转】Dom4j中自带的教程      摘要: 来自Dom4j中的cookbook  阅读全文
posted @ 2008-01-30 17:13 Paul Lin 阅读(2229) | 评论 (0)  编辑

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜