天天看點

圖解 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、學東西,學一點一點深一點。太深不好,一點就夠了