标签归档:Java

使用Apache POI生成Word文档不能被office读取的问题

近期应一个妹子的邀请做一些跟了一些和Word,excel相关的读写研究。需求很简单,就是从excel表格里读取一些白名单,然后在Word表格里找到这些匹配项再做相应的处理。因为每次手动操作很麻烦,所以呢妹子就找到了我,问下我能不能写个程序来做这件事。我一想这玩意儿应该挺简单的啊,肯定有开源的库来读写excel和Word,而且能提高妹子的工作效率,所以就欣然答应下来了。
之后就Google了一番看看有木有什么开源的库可以用,果不其然第一个就是Apache的POI项目,然后去官网看API文档。总的来说这个库使用起来还是蛮方便,下面介绍下读写Word和excel的代码:

这个只是读取excel的代码,值得一提是由WorkbookFactory创建出来的Workbook是支持xls和xlsx两种格式的文档,开发者不再需要区分是03还是07格式的excel文件,非常方便。然后读取Word文档却不像读取excel这么方便,他有两套API,一个是HWPFDocument只支持03格式的Word(后缀:doc)[……]

继续阅读

java序列化版本号

在写java程序的时候经常会看到类中会有一个序列化版本号:serialVersionUID。这个值有的类是1L,有的又是很长的数值,通常是这样声明的:

或者:

这是为什么呢?今天来总结下这个序列化版本号的作用。
先说说序列化,java的序列化指的是把java对象转化为字节序列(bytes)的过程,而反序列化就是把字节序列转化为java对象的过程。这个功能主要的作用是把java对象存储在磁盘上或者在网络上传输,如果没有这个功能你想要传输对象的话只能通过字符串拼接了。至于具体是怎么实现的查下api就知道,很简单,不再赘述了。正是因为有了反序列化机制,所以jvm需要判断需要转化的两个类是不是同一个类,于是就需要一个序列化版本号。如果在反序列化的时候两个类的serialVersionUID不一样则jvm会抛出InvalidCastException的异常;如果serialVersionUID一致则表明可以转换。
下面再来讨论下这个字段的值。
首先这个值是可[……]

继续阅读

struts2和servlet

今天上海下雨了,阴冷的天让人不想出门,窝在被窝里看到了一本书:《struts2-in-action》。第一感觉是struts2这个词已经被听烂了,大学里面各种web课程项目里几乎都有它的身影,SSH嘛,第一个S就是struts。但仔细一想struts究竟是什么呢?我竟然无法准确回答出来。带着疑问阅读了这本书的第一节:Struts 2: the modern web application framework
在读之前看到作者在书的留白处还写了这样一句话:
To world peace
and a global redistribution of prosperity(为了世界和平,为了全球繁荣的重新分配)
不得不感叹国外的程序员就是逼格高啊。
文章首先介绍了最基本的HTTP通信流程,客户端发送请求到服务器端,服务器返回数据。服务器端接受到的就是HTTP请求,包括一些基本HTTP REQUEST信息还有请求参数等。所以你拿到这一堆数据之后就需要把它们转换为java可用的对象,处理完逻辑之后再把java对象转换为文本返回给客户端。每个请求都这么做实在是太繁琐了,于是java提出了[……]

继续阅读

Java References

Java一共有四种强弱不同的引用,按照级别由高到低分别是:StrongReference、SoftReference、WeakReference、PhantomReference。
为了不重复造轮子,还是直接贴这篇文章中的一小段吧:查看出处
Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:
强引用 > 软引用 > 弱引用 > 虚引用
⑴强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
⑵软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用[……]

继续阅读

浅谈可重入性及其他

这篇文章主要讨论三个问题:1.什么是可重入性 2.什么是可重入锁 3.什么是ReentrantLock
首先为什么会讨论可重入性呢?大家知道java中有一个非常常用的类库叫ReentrantLock,中文翻译成可重入锁,每次看到这个翻译我的第一反应就是什么是可重入锁?为什么要这么命名呢?那么什么是ReentrantLock呢?Oracle的官方文档给出的解释是这样的:

A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchronized methods and statements, but with extended capabilities.

意思就是ReentrantLock和synchronized关键字所起的基本作用是一样的,但是提供了更多的扩展功能。看了这个解释并没有解答我的困惑,官方文档并没有解释什么是可重入锁,只是说了ReentrantLock提供了更多的功能。那么什么[……]

继续阅读