Java咖啡馆(9)——一个压缩归档实用软件

2016-02-19 12:02 3 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐Java咖啡馆(9)——一个压缩归档实用软件,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

优秀的创意造就实用的工具。借助Java内置强大的API,即使是Java的初学者,只要善于调兵遣将,也能够成为力拔山兮气盖世的霸王!先睹为快

在病毒肆虐以及BT下载流行的年代,按时备份是一个好习惯。一般而言,只有满足下列这些蛮横需求的软件,才称得上是一个得心应手的好工具:

★需要备份的文件可能分布在硬盘的各个角落;
★文件名可能比较复杂,不是用DOS的通配符就能够描述清楚的 ;
★按照文件的时间、大小、类型(文件或者目录)、最后修改时间等进行筛选;
★能够把这些文件压缩,并添加适当的注释帮助辨认 ;
★能够添加校验值以确保复制和网络传输时不出错;
★保持备份时的目录结构以便恢复;
★最好能够同时在多个平台运行;

这样的软件存在吗?没错,这就是我们这回咖啡馆的主题,我们将综合运用所学的知识,编写一个这样的实用软件—ExpZip。

首先介绍一下软件的使用方法。由于Java咖啡馆开馆以来才短短几期,还未介绍到GUI(图形用户界面)的设计,所以它仍然是一个命令行工具。举个实际例子,对于Java爱好者而言,自己编写的程序再重要不过了,这是N个小时的心血啊,自然应该经常备份,世界上没有后悔药卖的。打开“命令提示符”窗口,进入项目所在文件夹,输入:

java ExpZip "C:Documents and SettingsGary Chanworkspace" "[a-zA-Z_$][w$]*.java"

其中java是Java解释器,ExpZip就是我们将要编写的Java类编译以后的class文件。第一个参数代表目标文件夹,第二个参数代表目标文件文件名的表达式,具体含义请看后文详述。回车以后,Eclipse工作区文件夹中包括所有子文件夹中的所有Java源程序都已经备份到Backup.zip中了。可以用WinRAR打开这个ZIP包。

可以看到,这个压缩包保留了文件的路径信息,并且还有注释,记载着当时的压缩信息。而且,这是一个Java程序,理论上拿到MacOS上运行都是没有问题的。

总之,这是一个非常强大的软件,而且,我们已经有足够的知识来编写这个软件了。不再赘述,先新建一个项目。

Java文件操作

1.File类

Java中是通过File类来存取文件和路径的。没错,这是一个非常容易混淆的名字,你可能认为它仅仅能够处理文件,实际上它既可以代表了一个特定的文件,又可以代表某个文件夹内的文件名列表。如果它是文件,你可以通过length()方法获取它的大小、通过lastModified()方法最后修改时间,等等;如果它代表文件名列表,则可以用list()得到表示文件名列表的字符串数组,或者用listFiles()方法得到表示子文件列表的File数组。总之,在Java中文件夹和文件已经被统一成一个抽象的概念,只要了解它的原理,使用起来将会感到非常方便。

2.文件过滤

我们说过,File类的listFiles()方法可以得到表示子文件列表的File数组,如果仅仅想要得到特定的子文件而过滤掉其他的文件,则可以给listFiles()方法加上参数——一个过滤器。
所谓的过滤器,就是一个实现FilenameFilter接口的Java类。所谓接口(interface),就是仅仅定义了行为协议,所有声明实现这个接口的类必须具体实现这个接口的行为。换句话说,接口是一种契约,比如这里FilenameFilter的定义是这样子的:

public interface FilenameFilter {
boolean accept(File dir, String name);
}

我们要得到某个File类的所有子文件夹,过滤器FolderFilter类可以这么写:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)class FolderFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return new File(dir + "" + name).isDirectory();
}
}

你看,FolderFilter类通过implements表示对FilenameFilter接口的支持,然后实现了这个接口的accept方法。具体地,在accept方法中,通过传入的dir参数和name参数新建一个File实例,然后通过调用isDirectory()方法判断这个实例是否是文件夹,是则返回True,否则返回False。

注意到这个方法必须和FilenameFilter接口里面声明的一模一样。正因为如此,每次手动输入接口声明既麻烦又容易出错。还是让Eclipse干体力活吧!打开Eclipse,新建一个类,名字为FolderFilter,按下Interfaces文本列表右边的Add按钮,在弹出的对话框中输入FilenameFilter即可。实际上,Eclipse会根据你的输入进行筛选,非常聪明(见图1)。


别忘记只在Inherited abstract methods前面打勾。最后按下Finish,FolderFilter便创建好了,请根据上文补足代码。

假设path是一个File类的实例,我们便可以通过File[] subFolders = path.listFiles(new FolderFilter())得到path的子文件夹列表了。

这就是接口的使用。加上前两次我们讲解的Java语言中关于封装、继承和多态的知识,Java面向对象编程就基本讲完了。

3.过滤器原理

或许你会觉得过滤文件夹还要手动编写一个类,实在是太麻烦了。实则不然。
给listFiles()参数提供一个实现FilenameFilter接口的类的实例,惟一目的就是让listFiles()反过来调用作为参数的实例的accept方法。仔细体会一下这句绕口令,真是意味深长啊。这意味着你可以把任何实现FilenameFilter接口的类的实例当作参数传递,甚至是在运行时动态改变,从而使得程序更加灵活。而且,如果你要加入更多的过滤器,写额外的类就可以了,完全不需要修改原先的过滤器,这种动态策略的思想就是一种Strategy模式的体现。

黄糖故事

设计模式(Design Patterns)

建筑工程师Cristopher Alexander总结了建筑中的经验教训,发现有些问题总是一遍又一遍重复出现,当你总结出一套解决这种问题的核心方法以后,你只要放心使用这种解决方法即可,而完全不必再动脑筋想其他的方案。虽然这句话很朴素,但是却成了软件工程中一种举足轻重的方法学—设计模式的指导思想。

我们知道,建筑学有牛顿力学作为辩证的理论根据,只要尊重科学,就不可能设计出坍塌的建筑(即使坍塌,也是材料施工不过关或其他因素造成的)。但是,编写软件却没有这样的理论根据,因为程序只是告诉计算机语法,计算机只要如此这般依计而行,愚忠而已,而没有机制能保证程序的语意符合人类的思想。因此,程序才会有BUG,即使比尔对Windows XP大吼:“我以老祖宗的名义不准你有BUG!”,Windows XP能够领会精神吗?

虽然没有彻底的解决方法,Erich Gamma等四位大师级的计算机科学家通过借鉴建筑学中的模式的概念,创造出软件中的设计模式,通过精心萃取的23个模式,有效解决了软件的设计问题,给程序加上了一定程度的模型语意。具体的,请阅读这“四人帮”(Gang of Four)编写的《Design Patterns》一书。值得一提的是,我们上一回编写的名字解析器就是运用了其中的Factory模式,结构非常漂亮。

顺便说一句,现在支持设计模式的工具也越来越多 ,如果你想有朝一日从Java程序员升级为呼风唤雨的Java构架师,这可是一门必修课哦!

4.正则表达式(Regular Expression)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

说起正则表达式,即使不熟悉,你也会觉得非常眼熟。没错,现在的文本编辑软件,无论是UltraEdit还是EditPlus,无一不支持正则表达式。可以说,不支持正则表达式的编辑器肯定是三流货色啦。

理论上,正则表达式等价于有限自动机,能够表达相当丰富的语言,DOS中通配符的能力是无法望其项背的。学过编译原理或者计算机理论的朋友一定很熟悉了,可是,如果从头开讲,恐怕这期所有版面都不够。因此这里推荐你参考Sun免费的Java Tutorial中的Regular Expressions一章,写得很详细。即使你熟悉计算机理论的正则表达式,也建议抽空看一看,因为Java采取的是类Perl风格的语法,和理论书上有些出入。

比如我们要过滤出所有Java源程序。众所周知,Java文件名必须以字母、美元符号或者下划线开头,然后可以由数字、字母、美元符号或者下划线的任意组合,最后扩展名是java。用正则表达式写出来,就是“[a-zA-Z_$][a-zA-Z_$0-9]*.java”(不含引号)。

其中,[a-zA-Z_$]表示小写字母a至z、大写字母A至Z、美元符号或者下划线任取其一;[a-zA-Z_$0-9]*表示小写字母a至z、大写字母A至Z、美元符号、下划线以及0至9这十个数字的任意组合;“.java”表示Java源程序的扩展名,由于“.”在Java正则表达式中有特殊意义,所以“.”才表示一个“.”符号。

当然,Java正则表达式API中还有许多扩充,可以简写为:[a-zA-Z_$][w$]*.java。

有了这些知识,我们不难写出支持正则表达式的文件过滤器FileFilter,源代码如下:

public class FileFilter implements FilenameFilter {
private Pattern pattern;

public FileFilter(String regex) {
pattern = Pattern.compile(regex);
}

public boolean accept(File dir, String name) {
File file = new File(dir + "" + name);
return pattern.matcher(file.getName()).matches() && file.isFile();
}

}

Java中通过Pattern类来使用正则表达式。在FileFilter的构造函数中,通过把regex参数传递给Pattern的compi

来源:https://www.tulaoshi.com/n/20160219/1599555.html

延伸阅读
标签: 光圈 时间
相机品牌:Canon 相机型号:Canon EOS 5D Mark II 曝光:Manual control 光圈:F1.2 ISO:1600 曝光补偿:0 EV 曝光时间:0.02 sec CHAPTER 1 准备 要问女生最钟意什么地方?莫过于睡个慵懒的午觉后,找间温馨浪漫咖啡馆泡泡时间,点杯焦糖朵玛奇、一块芝士蛋糕发发呆。(小弟我进咖啡厅,一般都来杯碧螺春,呵呵~)于是这次约好在咖啡馆内拍摄,打...
咖啡馆唯美清新的人像摄影技巧 当下唯美清新的人像摄影风盛行,在拍摄这类风格的照片时,摄影师往往会选择环境优雅、富有浪漫情调的拍摄地,自然街头巷尾的咖啡馆就成了拍摄地的不二之选。咖啡馆深受欧洲男人的喜爱,维(www.tulaoshi.com)也纳一位艺术家曾说过这样一句话,我不在家里,就在咖啡馆,不在咖啡馆,就在去咖啡馆的路上。 今...
近年来拍靓妹当道,口袋稍微有闲钱的玩家,纷纷举起长枪短炮,优质佳作层出不穷。小弟我也是深受毒害的一员,从而爱上摄影这条不归路。很多朋友问我人像应该怎么拍,不晓得应该怎么讲好。恰好这几天跑广州出差,于是找了几个MM约拍,顺便小谈下简单的人像攻略,希望与大家一起提高摄影水平。 相机品牌:Canon 相机型号:Canon EOS 5D Mark II...
标签: 装修
1、厚重复古装修风格 咖啡代表着慢生活,品一杯咖啡,慢慢享受着安静的思考和阅读时光,这是人们内心深处的渴望。在吃饭要快、走路要快,整个人潮都是匆匆忙忙的今天,似乎慢生活早已经离我们远去。所以我们怀念从前,而我们只能在偶尔的闲暇,靠一杯咖啡,一屋复古的物件,把我们拉回从前的光景。那时候车马都很慢,那时候一天...
标签: 电脑入门
疯狂Shopping:美团团购 购物永远是女孩子们乐此不疲的事,在互联网发展至今,一个好的购物应用也是非常实用的。美团团购是专为Windows 8用户精心打造的团购客户端,采用了沉浸式体验设计,提供了团购、下单、搜索等服务。 美团团购 美团团购 美团团购 软件功能: 专为Windows 8用户打造; 支持左右切换浏览团购详情; 支持语义...

经验教程

896

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部