国庆假期,宅呀~ 无意中看到一篇java压缩算法的文章,就顺便度娘了一些相关文章来看。
本来想深入研究一下算法,但是,毕竟是假期,哪有那份心思啊,就实际应用简单Memo一下吧。
1. 中文乱码问题
其实这是无意中看到的,度娘一下漫天都是,看来各位程序猿还是以务实的应用为多啊。
度娘里,99%的帖子都是说用 Ant中的 org.apache.tools.zip.* 来代替 java.util.zip.*
这种办法来解决中文乱码问题。究其原因是,jdk中写死了UTF-8编码,而操作系统的文件编码如果不是UTF-8,如中文Windows下的GBK,则压缩、解压出的文件名就会出现乱码。
因为,org.apache.tools.zip.ZipOuputStream 有setEncoding(String) 方法,因此可以解决。
- zos.setEncoding("GBK"); // zos 是 ZipOuputStream 对象
- zos.setEncoding(System.getProperties("sun.jnu.encoding")); // 这样比上面更高大上(稳妥)吧
压缩时,(不知道什么原因?)Ant也没有提供 org.apache.tools.zip.ZipInputStream 这个类,所以只能使用JDK自带的类了。
- System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); // 上面是解压,那么在压缩之前,这样设置一下,更安全一些,很多帖子里没有提到哦
即便在度娘中输入关键字“1.7”,也搜不出来的,就是其实JDK1.7已经可以设置字符集了。
/** * Creates a new ZIP output stream. * * @param out the actual output stream * * @param charset the {@linkplain java.nio.charset.Charset charset} * to be used to encode the entry names and comments * * @since 1.7 */ public ZipOutputStream(OutputStream out, Charset charset) { super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); if (charset == null) throw new NullPointerException("charset is null"); this.zc = ZipCoder.get(charset); usesDefaultDeflater = true; }
Java1.7之后,我们只要在构造zos时,
ZipOutputStream zos = new ZipOutputStream(out, System.getProperties("sun.jnu.encoding"));
就可以解决中文乱码问题了。
是不是可以忘记 org.apache.tools.zip 呢?至少我没有看到,它还在其他什么方面更有优势。
2. 压缩/解压速度与压缩比
速度和效率是矛盾的,但优秀的算法可以尽量化解这个矛盾。可以,事实很残酷,没有任何一个已知的算法是速度最快且压缩比最高的。借用一下 http://www.importnew.com/14410.html 的结论吧
(黄道越长越好,速度快;绿道越短越好,文件体积小)
此文作者,优选 LZ4.FastNative,其次是Deflate(M=1)
这里我想说明两点
- 如果我们的应用系统,没有足够牛的文件存储系统(IO非常快),没有非常夸张的压力负荷,那么我并不建议选择 LZ4.FastNative,因为它依赖JNI,使用起来比纯java要复杂一些。而且我们的硬盘可能也“享受”不了如此的速度。
-
Deflate就是JDK自带的最“普遍”的 java.util.zip ,其实它的核心算法也是native的,但是我们不必自己在JNI上费心,JDK已经干好了。可是要注意,它默认使用的压缩率是 -1 !
我们需要将他设置为1,即速度最快(其实压缩率也没小多少)
ZipOutputStream zos = new ZipOutputStream(out, System.getProperties("sun.jnu.encoding")); // 还记得这个属性吧?
zos.setLevel(java.util.zip.Deflater.BEST_SPEED); // BEST_SPEED == 1
以上两点,是今天短暂学习的一点笔记,也算是至少总结了两篇以上的,网上比较不好找的、内容比较有用的文章,在给自己做个Memo的同时,如果对他人有一点点用处,想必也是极好的。
相关推荐
Delphi7中Memo组件实现查找替换功能
在memo中实现文字颜色设定,关键词高亮显示
MEMO控件MEMO控件
Java的学习总结,看完对初学者,也包括第一次接触java的人很有帮助
function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean; var Buffer, P: PChar; Size: Word; begin Result := False; if Length(SearchString) = 0 then ...
当memo内容多时,换行定位类似假死…… 1、内容读进readTxtKeep 2、要查找的关键字KeyStr 3、刷新Memeo显示ss 4、然后根据前面显示的次数、关键字,Memeo定位到需要的位置
Delphi 7.0 获取Memo控件中字符的可见行数,没讲 时在Memo控件中随便粘贴入一些字符,单击窗口中的“检测可见行数”按钮,即可得到该文本框控件中字符的行数,将这一系列执行命令集成在delphi的按钮监听事件中,编写...
如果不判断的话代码就非常简单了 ...这个代码实现了Windows记事本的主要功能。 新建,打开,保存,另存,退出。 文件拖拽打开文件 这主要是判断Memo内容是否修改过 http://www.cnblogs.com/xe2011/p/3374003.html
MyMemo
谁能帮我看看怎么样过滤MEMO字段吗?试验的是ACCESS,实际是SQLITE
封装了大数据DBF的读取、写入,并附有所使用javadbf.jar文件
动态改变FastReport内的Memo内容 Delphi 动态改变FastReport内的Memo内容 Delphi
Memo控件的使用方法和详解,比较全面的解释
动态改变FastReport内的Memo内容
有好的java万年历 界面分为上下两部分,上面试万年历,下面是memo提醒,有定时功能和音乐提醒
C++ builder memo string finding sample. 完整代码+工程。备忘。
Memo";;;是一个能记事和定时提醒的小程序。相对于其它的这类程序,这个程序可算“袖珍”,所有的功能都集中在一个面板上,操作也不算复杂。 面板的上半部分控件用于建立新的条目,在选择好日期、时间后点击...
Delphi 7 memo 第二版( chm )
该记事本使用的是Memo控件实现的,自己写的,不喜勿喷,界面也还行吧,个人感觉良好
Api-memo.zip,弹性和弹性密钥值存储.memo,弹性和弹性密钥值存储,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了...