国庆假期,宅呀~ 无意中看到一篇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组件实现查找替换功能 #### 一、引言 在软件开发过程中,文本处理是一项常见的需求,特别是在编写编辑器或文档管理工具时。Delphi作为一种高效的编程语言,提供了丰富的组件来帮助开发者快速构建...
本篇文章将详细讲解如何在Delphi的Memo组件中实现文字颜色设定和关键词高亮显示。 首先,我们需要了解Memo组件的基础特性。Memo组件继承自TControl,支持基本的文本操作如插入、删除、查找和替换。默认情况下,Memo...
标题中的“myjava.rar_MyMemo.INI_java.rar”表明这是一个与Java编程语言相关的压缩文件,其中包含了“MyMemo.INI”和“java.rar”两个关键元素。这可能是一个小型项目或者示例程序,用于演示如何处理配置文件(如My...
"Java_learning_memo.zip_memo"这个压缩文件显然包含了作者对于Java学习的深入理解和关键要点的总结,旨在帮助初学者和初次接触Java的人快速入门并掌握基础知识。 在"Java学习笔记.doc"文档中,我们可以期待找到...
在IT行业中,开发一款基于Java的日志或备忘录应用是一项常见的任务,它能够帮助用户记录日常事项,管理个人事务。本篇将深入探讨如何利用Java技术来实现这样一个“每日一记”备忘录应用。 首先,我们需要设计应用...
实现语法高亮时,需要注意性能问题,尤其是在处理大量代码时。可以采用分块处理、缓存已处理部分等方式来优化,避免一次性处理整个文本造成卡顿。 7. **用户自定义** 提供用户自定义语法高亮风格的功能,允许用户...
总的来说,动态改变FastReport中的Memo内容是通过访问组件对象,修改其Text属性,或利用数据绑定和事件处理来实现的。这为开发者提供了极大的灵活性,使得在报告生成过程中能够根据实际需求实时调整显示的信息。无论...
在IT行业中,数据库文件格式多种多样,其中DBF(dBase File)是一种常见的数据库文件类型,尤其在处理历史数据或与旧系统交互时尤为常见。本文将深入探讨如何使用Java来快速导出大量数据到DBF文件,以及如何利用`...
在Java中实现一个Memo提醒系统,我们需要关注以下几个核心组件: 1. **数据存储**:提醒信息通常需要持久化存储,可以使用文件、数据库或Java的`Properties`类。 2. **定时器(Timer)**:Java的`java.util.Timer`...
在FastReport中,可以使用`DataSource`属性来实现。例如,`Memo1.DataSource := DataSource1;`,其中`DataSource1`是你的数据源。 7. **运行时计算**:如果需要根据某些条件动态改变Memo内容,可以使用FastReport的...
MEMO控件MEMO控件
如果性能成为问题,可以考虑先将Memo字段的内容分割成小块,或者在应用程序层面进行预处理。 此外,如果你需要过滤的是特定格式的数据,如日期、数字或其他结构化信息,可能需要使用更复杂的查询逻辑,如正则表达式...
【标题】"Bonatic Memo" 是一款基于Visual Basic(VB)开发的应用程序,它扩展了系统内置记事本的功能,提供了更加丰富的文本编辑和管理体验。这款软件版本为"Bonatic Memo 2.0",意味着它至少经历了一次重大更新,...
一种常见的方法是利用布局(Layout)控件,如TLayout或TPanel,将Memo组件放置在这些布局控件内部,并调整布局的边距来间接实现Memo的边距效果。 1. 使用TLayout控件: - 首先,在Form上添加一个TLayout控件,然后...
总之,Java实现两台服务器之间的文件传输需要掌握网络编程、I/O流处理和多线程等技能。通过创建Socket连接,使用输入输出流读写文件,结合适当的多线程和工具库,我们可以构建出高效、可靠的文件传输系统。
当memo内容多时,换行定位类似假死…… 1、内容读进readTxtKeep 2、要查找的关键字KeyStr 3、刷新Memeo显示ss 4、然后根据前面显示的次数、关键字,Memeo定位到需要的位置
Memo组件在FastReport中用于显示多行文本,类似于常见的文本框。在某些场景下,我们可能需要根据程序运行时的数据或用户交互来动态更新Memo的内容,例如实时显示日志信息、动态生成报告等。 要实现动态改变...
function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean; var Buffer, P: PChar; Size: Word; begin Result := False; if Length(SearchString) = 0 then ...
在Delphi编程环境中, Memo 控件是一个常用的组件,用于显示和编辑多行文本。它通常被用作日志记录、用户输入或者简单的文本编辑。在某些情况下,我们可能需要动态地调整 Memo 控件的边框大小,以适应界面设计的变化...