简单文件搜索器的实现

说实话,哥不喜欢做总结。原因之一:发现网上前辈的总结已经很完善,或是比我写的还要充实。深感自己资历尚浅,惭愧之余,觉得实在没必要再为如此杂乱的网络环境添乱了。但总结还是得写,毕竟好记忆不如烂笔头,写精简一些、思路到位就是了,别人写得好的,就带个链接,也算积点阴德吧,嘿嘿。
本人觉得知识点是死的,唯有将它们组织起来,实现他们之间的交互,学起来才会有生气。如此,写总结就不会没话可说了,尽管做得确实不咋的。

本小项目实现了根据输入的关键字对选定目录下所有文件进行检索并列出文件名中包含关键字的文件的功能,以及检测选定文件内容中是否包含某关键字的功能。

主界面如图所示:
[img]http://dl.iteye.com/upload/attachment/525827/dac8efcc-7173-399d-8727-170a6efe6431.png[/img]


○1此界面的上三行两列明显用的是GridLayout(网格)布局管理器,该管理器在java.awt包下,声明此类布局管理器的对象的格式如下:
int  a; int  b; 
GridLayout gridLayout = new GridLayout(a,b);
a为行数;b为列数;添加组件时根据添加的顺序从左到右(此为默认,可修改,但未试过)排完一行再到下一行。上面六个组件装在一个Jpanel里,下面的列表也装在(非直接)另一个Jpanel中,再用一个BorderLayout管理器装在到主界面上。该管理器的简单用法如下:
JFrame  frame  =  new  JFrame(“***”);
frame.setLayoutManager(new BorderLayout());
Button b1 = new Button(“1”);
Button b2 = new Button(“2”);
Button b3 = new Button(“3”);
Button b4 = new Button(“4”);
Button b5 = new Button(“5”);
//添加格式
Frame.add(b1,BorderLayout.NORTH);//添加到上方
Frame.add(b2,BorderLayout.LEFT);//添加到左边
Frame.add(b3,BorderLayout.CENTER);// 添加到中间
Frame.add(b4,BorderLayout.RIGHT);// 添加到右边
Frame.add(b5,BorderLayout.SOUTH);// 添加到下方
FlowLayout、GridLayout以及BorderLayout是三个最常用的布局管理器,其中GridLayout和BorderLayout会使控件将从面板分配到的空间填充。此三个布局管理器非常易用,但面对要求用大小不一的控件编排出复杂的界面时,其局限性就显示出来了。此时就需要用到GridBagLayout(网袋)布局管理器了,其用法非常灵活,也很难,曾在做连连看的界面中用到,但对其用法还是很陌生。这里就先不介绍了。

○2关于高级组件,有很多知识点都还没接触过,只是通过看别人的代码来窥探其奥秘,使用的时候也只能是按照别人代码所给的提示来用。本小项目实现了Jlist的简单使用以及为Jlist添加了滚动条,简单代码如下:
DefaultListModel fileListModel = new DefaultListModel();/*高级组件一般都配有Model(实例(本人觉得如此翻译较为合适)),此为高级组件的灵魂所在大凡涉及到数据的操作必须劳烦Model*/
JList fileList = new JList(fileListModel);//如此声明Jlist对象
JScrollPane sp = new JScrollPane(fileList);/*只有将Jlist对象装进JscrollPane中才能实现滚动条本小项目中Jlist实例对象对数据操作用到的方法*/((DefaultListModel) fileList.getModel() ).addElement(Object obj);/*添加数据的方法必须先通过Jlist实例对象获取Model,再通过Model来操作数据*/((DefaultListModel) fileList.getModel() ).getElementAt(int index);//获取数据的方法
((DefaultListModel) fileList.getModel() ).clean();//删除所有数据

○3在选择查找范围时用到了JFileChooser文件选择器,JfileChooser的默认模式是只能选择文件,在这里用到了方法void setFileSelectionMode(int mode)来修改模式,简单实用方法如下:
JfileChooser  chooser  =  new  JfileChooser(Sring path);//该构造函数通过path来设置默认路径
chooser.setFileSelectionMode(JfileChooser.DIRECTORIES_ONLY);/* 常量DIRECTORIES_ONLY指定选择器只能选择目录,FILES_ONLY指定选择器只能选择文件,FILES_AND_DIRECTORIES为两者皆可*/
int returnVal = chooser.showOpenDialog(null);//获取对话框的返还值
if(returnVal == JfileChooser.APPROVE_OPTION){/*当返回值等于常APPROVE_OPTION时,为按下了确认键后触发的返回值*/

……//方法体

}

还推荐个链接:[url]http://blog.csdn.net/andycpp/article/details/1737658[/url]

○4在限制输入的格式时使用到了简单的正则表达式,由于是刚接触,所以点到为止,详情请查看API文档中的java.util.regex.Matcher;java.util.regex.Pattern。正则表达式在字符串的匹配、查找、修改的操作中使用极为方便。本例用到的语句为:
String  key;
……
Boolean check = key.matches(“\\s+”) ;//意思是当key中存在空白字符时,其值为真。
○5本小项目中还为Jlist实例对象实现了鼠标监听,当双击列表中的元素时会弹出一个对话框,可输入关键字,并检测选定文件内容中是否包含该关键字,也可检测列表中所有文件内容中是否包含该关键字,并将包含该关键字文件重新列在列表上。


○6在实现查找文件名中包含指定关键字的文件时,使用到了java.io.File。当实例化一个File对象时,该对象知识存在于内存中,只有当File的实例化对象调用createNewFile()、delete()等方法时才能在磁盘上对文件或目录进行新建、删除等操作。File中常用的方法还有:listRoots():静态方法,返还一个磁盘根目录数组;
exists():判断文件或目录是否存在;
isDirectory(): 判断File实例对象是否为目录;
isFile():判断File实例对象是否为文件;
getAbsolutePath():获取File实例对象的绝对路径;
getName():获取File实例对象的名字;
length():获取文件内容的字节长度;


○7在实现检测文件内容是否包含指定关键字时,需要读取文件的内容,因此需要用到输入流。事物间通过传递消息来实现交互,消息的传递就是数据的传输。从文件到控制台或从控制台到服务器等,存在着数据的传输。在Java语言程序设计中,数据传输的通道被定义成流,用java的OOP思想可以将流形象地比喻成管道或水管。借助取水、装水的形象画面,可以大概的感知流的运作方式。
按方向,可将流分为输入流和输出流。这里的输入输出是相对于程序(或说控制台)而言的,数据流向控制台则为输入流,数据从控制台流出则为输出流。
按读取数据的最小单位,可将流分为字节流和字符流,1字符=2字节。字节流为FileInputStream和FileOutputStream,字符流为FileReader和FileWriter。
按功能,可将流分为节点流和处理流。节点流为可以从一个特定的数据源(节点,如:文件、内存)读取数据,也就是字节流和字符流。处理流是“套接”在已存在的节点流或处理流之上,通过对数据的加工处理为程序(控制台)提供更为强大的读写功能的流,包括BufferedInputStream和BufferedOutputStream(缓冲流)、DataInputStream和DataOutputStream(数据流)、ObjectInputStream和ObjectOutputStream(对象流)等。
当使用字节流读写数据时,数据是一个字节一个字节的读写的。以读写一个文件为例:一次读写的过程包括以下几个步骤:源文件—>操作系统内存—>JVM内存—>程序变量操作系统内存目标文件。如此读写,效率非常低。而缓冲流就拟补了它的不足。缓冲流的机制是让缓冲流对象在JVM中开辟一定大小的缓存区,将包含的节点流中的数据填充该内部缓冲区,当缓冲区装满后,在一次性的将缓冲区的全部数据读写出去。如此真的会快吗?实践证明是快了很多,但是用语言表述起来还是成问题。那好再打个比方:假设现在叫你到100米外的水池取水,返回来并用取回的水将一个大水桶装满。有两种瓶子给你选择:一个容量为100毫升的瓶子、一个容量为2升的瓶子。要求你在最少的时间内完成任务,你会选哪种瓶子?(不限交通工具~.~)还有一点需要注意的是:频繁的对磁盘进行数据的读写对磁盘来说,是有害无益的,会加快磁盘老化。
像用水龙头接水一样,接完后要记得关闭水龙头。同理,当我们使用流完成数据的写出、读入时,要记得把流关闭。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值