您的位置:首页 > 编程语言 > Java开发

Java咖啡馆(9)——一个压缩归档实用软件-Java基础-Java-编程开发

2008-05-20 04:57 936 查看
google_ad_client = "pub-8800625213955058";

/* 336x280, 创建于 07-11-21 */

google_ad_slot = "0989131976";

google_ad_width = 336;

google_ad_height = 280;

//

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

先睹为快

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

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

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

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

java ExpZip "C:/Documents and Settings/Gary Chan/workspace" "[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类可以这么写:

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模式的体现。

[1]

[2]

[3]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: