天天看点

图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结

更具体地说,这是一个策略模式的例子,因为list()实现了基本功能,而按着形式提供了这个策略,完善list()提供服务所需的算法。

java.io.filenamefilter是文件名过滤器接口,即过滤出符合规则的文件名组。

图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结

从io的uml可以看出,filenamefilter接口独立,而且没有它的实现类。下面就看看它的源码:

1

2

3

4

5

6

7

8

9

<code>public</code> <code>interface</code> <code>filenamefilter {</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 测试指定文件是否应该包含在某一文件列表中。</code>

<code>     </code><code>*</code>

<code>     </code><code>* @param   被找到的文件所在的目录。</code>

<code>     </code><code>* @param   文件的名称</code>

<code>     </code><code>*/</code>

<code>    </code><code>boolean</code> <code>accept(file dir, string name);</code>

<code>}</code>

从jdk1.0就存在了,功能也很简单:就是为了过滤文件名。只要在accept()方法中传入相应的目录和文件名即可。

深度分析:接口要有真正的实现才能算行为模式中真正实现。所以这里使用的是策略模式,涉及到三个角色:

环境(context)角色 抽象策略(strategy)角色 具体策略(context strategy)角色

结构图如下:

图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结

其中,filenamefiler interface 就是这里的抽象策略角色。其实也可以用抽象类实现。

图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

<code>package</code> <code>org.javacore.io;</code>

<code>import</code> <code>java.io.file;</code>

<code>import</code> <code>java.io.filenamefilter;</code>

<code>/*</code>

<code> </code><code>* copyright [2015] [jeff lee]</code>

<code> </code><code>*</code>

<code> </code><code>* licensed under the apache license, version 2.0 (the "license");</code>

<code> </code><code>* you may not use this file except in compliance with the license.</code>

<code> </code><code>* you may obtain a copy of the license at</code>

<code> </code><code>* unless required by applicable law or agreed to in writing, software</code>

<code> </code><code>* distributed under the license is distributed on an "as is" basis,</code>

<code> </code><code>* without warranties or conditions of any kind, either express or implied.</code>

<code> </code><code>* see the license for the specific language governing permissions and</code>

<code> </code><code>* limitations under the license.</code>

<code> </code><code>*/</code>

<code>/**</code>

<code> </code><code>* @author jeff lee</code>

<code> </code><code>* @since 2015-7-20 13:31:41</code>

<code> </code><code>* 类名过滤器的使用</code>

<code>public class filenamefiltert {</code>

<code>    </code><code>public static void main(string[] args) {</code>

<code>        </code><code>// io包路径</code>

<code>        </code><code>string dir = "src" + file.separator +</code>

<code>                </code><code>"org" + file.separator +</code>

<code>                </code><code>"javacore" + file.separator +</code>

<code>                </code><code>"io";</code>

<code>        </code><code>file file = new file(dir);</code>

<code>        </code><code>// 创建过滤器文件</code>

<code>        </code><code>myfilter filter = new myfilter("y.java");</code>

<code>        </code><code>// 过滤</code>

<code>        </code><code>string files[] = file.list(filter);</code>

<code>        </code> 

<code>        </code><code>// 打印</code>

<code>        </code><code>for (string name : files) {</code>

<code>            </code><code>system.err.println(name);</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>     </code><code>*  内部类实现过滤器文件接口</code>

<code>    </code><code>static</code> <code>class</code> <code>myfilter </code><code>implements</code> <code>filenamefilter {</code>

<code>        </code><code>private</code> <code>string type;</code>

<code>        </code><code>public</code> <code>myfilter (string type) {</code>

<code>            </code><code>this</code><code>.type = type;</code>

<code>        </code><code>@override</code>

<code>        </code><code>public</code> <code>boolean</code> <code>accept(file dir, string name) {</code>

<code>            </code><code>return</code> <code>name.endswith(type);</code><code>// 以type结尾</code>

其中我们用内部类的实现,实现了filenamefilter interface。所以当我们file list调用接口方法时,传入myfilter可以让文件名规则按我们想要的获得。

右键 run 下,可以看到如图所示的输出:

图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结

补充:

string[] fs = f.list() file[] fs = f.listfiles() string []fs = f.list(filenamefilter filter);; file[]fs = f.listfiles(filenamefilter filter);
图解 Java IO : 二、FilenameFilter源码一、FilenameFilter源码二、使用方法三、总结
1、看源码很简单,看怎么用先,在深入看有什么数据结构,设计模式。理理就清楚了 2、学东西,学一点一点深一点。太深不好,一点就够了