2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  Java </b></p><p>  Java I/O 系統(tǒng)</p><p>  對編程語言的設(shè)計者來說,創(chuàng)建一套好的輸入輸出(I/O)系統(tǒng),是一項難度極高的任務(wù)。</p><p>  這一點可以從解決方案的數(shù)量之多上看出端倪。這個問題難就難在它要面對的可能性太多了。不僅是因為有那么多I/O的源和目地(文件,控制

2、臺,網(wǎng)絡(luò)連接等等),而且還有很多方法(順序的『sequential』,隨機的『random-access』,緩存的『buffered』,二進制的『binary』,字符方式的『character』,行的『by lines』,字的『by words』,等等)。 </p><p>  Java類庫的設(shè)計者們用"創(chuàng)建很多類"的辦法來解決這個問題。坦率地說Java I/O系統(tǒng)的類實在是太多了,以至于初看

3、起來會把人嚇著(但是,具有諷刺意味的是,這種設(shè)計實際上是限制了類的爆炸性增長)。此外,Java在1.0版之后又對其I/O類庫作了重大的修改,原先是面向byte的,現(xiàn)在又補充了面向Unicode字符的類庫。為了提高性能,完善功能,JDK 1.4又加了一個nio(意思是"new I/O"。這個名字會用上很多年)。這么以來,如果你想對Java的I/O類庫有個全面了解,并且做到運用自如,你就得先學(xué)習(xí)大量的類。此外,了解I/O

4、類庫的演化的歷史也是相當重要的??赡苣愕牡谝环磻?yīng)是"別拿什么歷史來煩我了,告訴我怎么用就可以了!"但問題是,如果你對這段歷史一無所知,很快就會被一些有用或是沒用的類給搞糊涂了。 </p><p>  本章會介紹Java標準類庫中的各種I/O類,及其使用方法。 </p><p><b>  File 類</b></p><p>

5、;  在介紹直接從流里讀寫數(shù)據(jù)的類之前,我們先介紹一下處理文件和目錄的類。 </p><p>  File類有一個極具欺騙性的名字;或許你會認為這是一個關(guān)于文件的類,但它不是。你可以用它來表示某個文件的名字,也可以用它來表示目錄里一組文件的名字。如果它表示的是一組文件,那么你還可以用list( )方法來進行查詢,讓它會返回String數(shù)組。由于元素數(shù)量是固定的,因此數(shù)組會比容器更好一些。如果你想要獲取另一個目錄的

6、清單,再建一個File對象就是了。實際上,叫它 "FilePath"可能會更好一些。下面我們舉例說明怎樣使用這個類及其相關(guān)的FilenameFilter接口。 </p><p><b>  目錄列表器</b></p><p>  假設(shè)你想看看這個目錄。有兩個辦法。一是不帶參數(shù)調(diào)用list( )。它返回的是File對象所含內(nèi)容的完整清單。但是,如果你

7、要的是一個"限制性列表(restricted list)"的話 —— 比方說,你想看看所有擴展名為.java的文件 —— 那么你就得使用"目錄過濾器"了。這是一個專門負責挑選顯示File對象的內(nèi)容的類。 </p><p>  下面就是源代碼??纯?,用了java.utils.Arrays.sort( )和11章的AlphabeticComparator之后,我們沒費吹灰之力就

8、對結(jié)果作了排序(按字母順序): </p><p>  //: c12:DirList.java</p><p>  // Displays directory listing using regular expressions.</p><p>  // {Args: "D.*\.java"}</p><p>  impo

9、rt java.io.*;</p><p>  import java.util.*;</p><p>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;</p><p>  public class DirList {</p><p>

10、;  public static void main(String[] args) {</p><p>  File path = new File(".");</p><p>  String[] list;</p><p>  if(args.length == 0)</p><p>  list = path.lis

11、t();</p><p><b>  else</b></p><p>  list = path.list(new DirFilter(args[0]));</p><p>  Arrays.sort(list, new AlphabeticComparator());</p><p>  for(int i = 0;

12、 i < list.length; i++)</p><p>  System.out.println(list[i]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  class DirFilter implements Filename

13、Filter {</p><p>  private Pattern pattern;</p><p>  public DirFilter(String regex) {</p><p>  pattern = Pattern.compile(regex);</p><p><b>  }</b></p>

14、<p>  public boolean accept(File dir, String name) {</p><p>  // Strip path information, search for regex:</p><p>  return pattern.matcher(</p><p>  new File(name).getName()).

15、matches();</p><p><b>  }</b></p><p><b>  } ///:~</b></p><p>  DirFilter實現(xiàn)了FilenameFilter接口。我們來看看FilenameFilter究竟有多簡單: </p><p>  public interface

16、 FilenameFilter {</p><p>  boolean accept(File dir, String name);</p><p><b>  }</b></p><p>  也就是說,這類對象的任務(wù)就是提供一個accept( )的方法。之所以要創(chuàng)建這個類,就是要給list( )提供一個accept( )方法,這樣當list(

17、 )判斷該返回哪些文件名的時候,能夠"回過頭來調(diào)用"accept( )方法。因此,這種結(jié)構(gòu)通常被稱為回調(diào)(callback)。更準確地說,由于list( )實現(xiàn)了基本功能,而FilenameFilter提供了"對外服務(wù)所需的算法",因此這是一種"策略模式(Strategy Pattern)"。由于list( )拿FilenameFilter對象當參數(shù),因此你可以將任何實現(xiàn)Fil

18、enameFilter接口的對象傳給它,并以此(甚至是在運行時)控制list( )的工作方式?;卣{(diào)能提高程序的靈活性。 </p><p>  DirFilter還告訴我們,interface只是包含了一些方法,它沒說你只能寫這些方法。(但是,你至少要定義接口里有的方法。) 這里我們還定義了DirFilter的構(gòu)造函數(shù)。 </p><p>  accept( )方法需要兩個參數(shù),一個是Fil

19、e對象,表示這個文件是在哪個目錄里面的;另一個是String,表示文件名。雖然你可以忽略它們中的一個,甚至兩個都不管,但是你大概總得用一下文件名吧。記住,list( )會對目錄里的每個文件調(diào)用accept( ),并以此判斷是不是把它包括到返回值里;這個判斷依據(jù)就是accept( )的返回值。 </p><p>  切記,文件名里不能有路徑信息。為此你只要用一個String對象來創(chuàng)建File對象,然后再調(diào)用這個Fi

20、le對象的getName( )就可以了。它會幫你剝離路徑信息(以一種平臺無關(guān)的方式)。然后再在accept( )里面用正則表達式(regular expression)的matcher對象判斷,regex是否與文件名相匹配。兜完這個圈子,list( )方法返回了一個數(shù)組。 </p><p><b>  匿名內(nèi)部類</b></p><p>  這是用匿名內(nèi)部類(詳見第八

21、章)來重寫程序的絕佳機會。下面我們先創(chuàng)建一個返回FilenameFilter的filter( )方法。 </p><p>  //: c12:DirList2.java</p><p>  // Uses anonymous inner classes.</p><p>  // {Args: "D.*\.java"}</p>&l

22、t;p>  import java.io.*;</p><p>  import java.util.*;</p><p>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;</p><p>  public class DirList2 {</p

23、><p>  public static FilenameFilter filter(final String regex) {</p><p>  // Creation of anonymous inner class:</p><p>  return new FilenameFilter() {</p><p>  private Pat

24、tern pattern = Pattern.compile(regex);</p><p>  public boolean accept(File dir, String name) {</p><p>  return pattern.matcher(</p><p>  new File(name).getName()).matches();</p&g

25、t;<p><b>  }</b></p><p>  }; // End of anonymous inner class</p><p><b>  }</b></p><p>  public static void main(String[] args) {</p><p> 

26、 File path = new File(".");</p><p>  String[] list;</p><p>  if(args.length == 0)</p><p>  list = path.list();</p><p><b>  else</b></p><

27、;p>  list = path.list(filter(args[0]));</p><p>  Arrays.sort(list, new AlphabeticComparator());</p><p>  for(int i = 0; i < list.length; i++)</p><p>  System.out.println(list[

28、i]);</p><p><b>  }</b></p><p><b>  } ///:~</b></p><p>  注意,filter( )的參數(shù)必須是final的。要想在匿名內(nèi)部類里使用其作用域之外的對象,只能這么做。 </p><p>  這是對前面所講的代碼的改進,現(xiàn)在FilenameF

29、ilter類已經(jīng)與DirList2緊緊地綁在一起了。不過你還可以更進一步,把這個匿名內(nèi)部類定義成list( )的參數(shù),這樣代碼會變得更緊湊: </p><p>  //: c12:DirList3.java</p><p>  // Building the anonymous inner class "in-place."</p><p>  

30、// {Args: "D.*\.java"}</p><p>  import java.io.*;</p><p>  import java.util.*;</p><p>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;</p

31、><p>  public class DirList3 {</p><p>  public static void main(final String[] args) {</p><p>  File path = new File(".");</p><p>  String[] list;</p><

32、;p>  if(args.length == 0)</p><p>  list = path.list();</p><p><b>  else</b></p><p>  list = path.list(new FilenameFilter() {</p><p>  private Pattern pat

33、tern = Pattern.compile(args[0]);</p><p>  public boolean accept(File dir, String name) {</p><p>  return pattern.matcher(</p><p>  new File(name).getName()).matches();</p>&l

34、t;p><b>  }</b></p><p><b>  });</b></p><p>  Arrays.sort(list, new AlphabeticComparator());</p><p>  for(int i = 0; i < list.length; i++)</p><

35、;p>  System.out.println(list[i]);</p><p><b>  }</b></p><p><b>  } ///:~</b></p><p>  現(xiàn)在該輪到main( )的參數(shù)成final了,因為匿名內(nèi)部類要用它的arg[0]了。 </p><p>  這個例

36、子告訴我們,可以用匿名內(nèi)部類來創(chuàng)建專門供特定問題用的,一次性的類。這種做法的好處是,它能把解決某個問題的代碼全都集中到一個地方。但是從另一角度來說,這樣做會使代碼的可讀性變差,所以要慎重。 </p><p><b>  查看與創(chuàng)建目錄</b></p><p>  File類的功能不僅限于顯示文件或目錄。它還能幫你創(chuàng)建新的目錄甚至是目錄路徑(directory path

37、),如果目錄不存在的話。此外它還能用來檢查文件的屬性(大小,上次修改的日期,讀寫權(quán)限等),判斷File對象表示的是文件還是目錄,以及刪除文件。下面這段程序演示了File類的一些其他方法(請查閱JDK文檔,以了解其全部功能): </p><p>  //: c12:MakeDirectories.java</p><p>  // Demonstrates the use of the Fi

38、le class to</p><p>  // create directories and manipulate files.</p><p>  // {Args: MakeDirectoriesTest}</p><p>  import com.bruceeckel.simpletest.*;</p><p>  import ja

39、va.io.*;</p><p>  public class MakeDirectories {</p><p>  private static Test monitor = new Test();</p><p>  private static void usage() {</p><p>  System.err.println(&

40、lt;/p><p>  "Usage:MakeDirectories path1 ...\n" +</p><p>  "Creates each path\n" +</p><p>  "Usage:MakeDirectories -d path1 ...\n" +</p><p> 

41、 "Deletes each path\n" +</p><p>  "Usage:MakeDirectories -r path1 path2\n" +</p><p>  "Renames from path1 to path2");</p><p>  System.exit(1);</p>

42、;<p><b>  }</b></p><p>  private static void fileData(File f) {</p><p>  System.out.println(</p><p>  "Absolute path: " + f.getAbsolutePath() +</p>

43、;<p>  "\n Can read: " + f.canRead() +</p><p>  "\n Can write: " + f.canWrite() +</p><p>  "\n getName: " + f.getName() +</p><p>  "\n getP

44、arent: " + f.getParent() +</p><p>  "\n getPath: " + f.getPath() +</p><p>  "\n length: " + f.length() +</p><p>  "\n lastModified: " + f.lastModi

45、fied());</p><p>  if(f.isFile())</p><p>  System.out.println("It's a file");</p><p>  else if(f.isDirectory())</p><p>  System.out.println("It's

46、a directory");</p><p><b>  }</b></p><p>  public static void main(String[] args) {</p><p>  if(args.length < 1) usage();</p><p>  if(args[0].equals(

47、"-r")) {</p><p>  if(args.length != 3) usage();</p><p><b>  File</b></p><p>  old = new File(args[1]),</p><p>  rname = new File(args[2]);</p&g

48、t;<p>  old.renameTo(rname);</p><p>  fileData(old);</p><p>  fileData(rname);</p><p>  return; // Exit main</p><p><b>  }</b></p><p>  

49、int count = 0;</p><p>  boolean del = false;</p><p>  if(args[0].equals("-d")) {</p><p><b>  count++;</b></p><p>  del = true;</p><p>

50、;<b>  }</b></p><p><b>  count--;</b></p><p>  while(++count < args.length) {</p><p>  File f = new File(args[count]);</p><p>  if(f.exists())

51、 {</p><p>  System.out.println(f + " exists");</p><p><b>  if(del) {</b></p><p>  System.out.println("deleting..." + f);</p><p>  f.dele

52、te();</p><p><b>  }</b></p><p><b>  }</b></p><p>  else { // Doesn't exist</p><p>  if(!del) {</p><p>  f.mkdirs();</p>

53、<p>  System.out.println("created " + f);</p><p><b>  }</b></p><p><b>  }</b></p><p>  fileData(f);</p><p><b>  }</b>

54、</p><p>  if(args.length == 1 &&</p><p>  args[0].equals("MakeDirectoriesTest"))</p><p>  monitor.expect(new String[] {</p><p>  "%% (MakeDirecto

55、riesTest exists"+</p><p>  "|created MakeDirectoriesTest)",</p><p>  "%% Absolute path: "</p><p>  + "\\S+MakeDirectoriesTest",</p><p&g

56、t;  "%% Can read: (true|false)",</p><p>  "%% Can write: (true|false)",</p><p>  " getName: MakeDirectoriesTest",</p><p>  " getParent: null&quo

57、t;,</p><p>  " getPath: MakeDirectoriesTest",</p><p>  "%% length: \\d+",</p><p>  "%% lastModified: \\d+",</p><p>  "It's a di

58、rectory"</p><p><b>  });</b></p><p><b>  }</b></p><p><b>  } ///:~</b></p><p>  在fileData( )演示了全套查詢文件和目錄路徑信息的方法。 </p>&l

59、t;p>  main( )的第一條指令就是執(zhí)行renameTo( )。它會把文件重命名成(或者說移動到)新的目錄,也就是參數(shù)所給出的目錄。而參數(shù)本身就是一個File對象。這個方法也適用于目錄。 </p><p>  如果你試過上面那段程序,就會發(fā)現(xiàn),你能用它創(chuàng)建任意復(fù)雜的目錄路徑,因為mkdirs( )已經(jīng)幫你打理好了。 </p><p><b>  輸入與輸出</b

60、></p><p>  I/O類庫常使用"流(stream)"這種抽象。所謂"流"是一種能生成或接受數(shù)據(jù)的,代表數(shù)據(jù)的源和目標的對象。流把I/O設(shè)備內(nèi)部的具體操作給隱藏起來了。 </p><p>  正如JDK文檔所顯示的,Java的I/O類庫分成輸入和輸出兩大部分。所有InputStream和Reader的派生類都有一個基本的,繼承下來的,能

61、讀取單個或byte數(shù)組的read( )方法。同理,所有OutputStream和Writer的派生類都有一個基本的,能寫入單個或byte數(shù)組的write( )方法。但通常情況下,你是不會去用這些方法的;它們是給其它類用的 —— 而后者會提供一些更實用的接口。因此,你很少會碰到只用一個類就能創(chuàng)建一個流的情形,實際上你得把多個對象疊起來,并以此來獲取所需的功能。Java的流類庫之所以會那么讓人犯暈,最主要的原因就是"你必須為創(chuàng)建一

62、個流而動用多個對象"。 </p><p>  我們最好還是根據(jù)其功能為這些class歸個類。Java 1.0的類庫設(shè)計者們是從決定"讓所有與輸入相關(guān)的類去繼承InputStream"入手的。同理,所有與輸出相關(guān)的類就該繼承OutputStream了。</p><p>  添加屬性與適用的接口</p><p>  使用"分層對象

63、(layered objects)",為單個對象動態(tài)地,透明地添加功能的做法,被稱為Decorator Pattern。(模式[61]是Thinking in Patterns (with Java)的主題。)Decorator模式要求所有包覆在原始對象之外的對象,都必須具有與之完全相同的接口。這使得decorator的用法變得非常的透明--無論對象是否被decorate過,傳給它的消息總是相同的。這也是Java I/O類庫要

64、有"filter(過濾器)"類的原因:抽象的"filter"類是所有decorator的基類。(decorator必須具有與它要包裝的對象的全部接口,但是decorator可以擴展這個接口,由此就衍生出了很多"filter"類)。 </p><p>  Decorator模式常用于如下的情形:如果用繼承來解決各種需求的話,類的數(shù)量會多到不切實際的地步。J

65、ava的I/O類庫需要提供很多功能的組合,于是decorator模式就有了用武之地。[62] 但是decorator有個缺點,在提高編程的靈活性的同時(因為你能很容易地混合和匹配屬性),也使代碼變得更復(fù)雜了。Java的I/O類庫之所以會這么怪,就是因為它"必須為一個I/O對象創(chuàng)建很多類",也就是為一個"核心"I/O類加上很多decorator。 </p><p>  為In

66、putStream和OutputStream定義decorator類接口的類,分別是FilterInputStream和FilterOutputStream。這兩個名字都起得不怎么樣。FilterInputStream和FilterOutputStream都繼承自I/O類庫的基類InputStream和OutputStream,這是decorator模式的關(guān)鍵(惟有這樣decorator類的接口才能與它要服務(wù)的對象的完全相同)。 <

67、;/p><p>  用FilterInputStream讀取InputStream</p><p>  FilterInputStream及其派生類有兩項重要任務(wù)。DataInputStream可以讀取各種primitive及String。(所有的方法都以"read"打頭,比如readByte( ), readFloat( ))。它,以及它的搭檔DataOutputStre

68、am,能讓你通過流將primitive數(shù)據(jù)從一個地方導(dǎo)到另一個地方。這些"地方"都列在表12-1里。 </p><p>  其它的類都是用來修改InputStream的內(nèi)部行為的:是不是做緩沖,是不是知道它所讀取的行信息(允許你讀取行號或設(shè)定行號),是不是會彈出單個字符。后兩個看上去更像是給編譯器用的(也就是說,它們大概是為Java編譯器設(shè)計的),所以通常情況下,你是不大會用到它們的。 <

69、;/p><p>  不論你用哪種I/O設(shè)備,輸入的時候,最好都做緩沖。所以對I/O類庫來說,比較明智的做法還是把不緩沖當特例(或者去直接調(diào)用方法),而不是像現(xiàn)在這樣把緩沖當作特例。</p><p><b>  JAVA</b></p><p>  The Java I/O System</p><p>  Creating

70、a good input/output (I/O) system is one of the more difficult tasks for the language designer.</p><p>  This is evidenced by the number of different approaches. The challenge seems to be in covering all even

71、tualities. Not only are there different sources and sinks of I/O that you want to communicate with (files, the console, network connections, etc.), but you need to talk to them in a wide variety of ways (sequential, rand

72、om-access, buffered, binary, character, by lines, by words, etc.). </p><p>  The Java library designers attacked this problem by creating lots of classes. In fact, there are so many classes for Java’s I/O sy

73、stem that it can be intimidating at first (ironically, the Java I/O design actually prevents an explosion of classes). There was also a significant change in the I/O library after Java 1.0, when the original byte-oriente

74、d library was supplemented with char-oriented, Unicode-based I/O classes. In JDK 1.4, the nio classes (for “new I/O,” a name we’ll still be using year</p><p>  This chapter will give you an introduction to t

75、he variety of I/O classes in the standard Java library and how to use them. </p><p>  The File class</p><p>  Before getting into the classes that actually read and write data to streams, we’ll

76、look at a utility provided with the library to assist you in handling file directory issues. </p><p>  The File class has a deceiving name; you might think it refers to a file, but it doesn’t. It can represe

77、nt either the name of a particular file or the names of a set of files in a directory. If it’s a set of files, you can ask for that set using the list( ) method, which returns an array of String. It makes sense to r

78、eturn an array rather than one of the flexible container classes, because the number of elements is fixed, and if you want a different directory listing, you just create a different</p><p>  A directory list

79、er</p><p>  Suppose you’d like to see a directory listing. The File object can be listed in two ways. If you call list( ) with no arguments, you’ll get the full list that the File object contains. Howev

80、er, if you want a restricted list—for example, if you want all of the files with an extension of .java—then you use a “directory filter,” which is a class that tells how to select the File objects for display. </p>

81、<p>  Here’s the code for the example. Note that the result has been effortlessly sorted (alphabetically) using the java.utils.Arrays.sort( ) method and the AlphabeticComparator defined in Chapter 11:</p&g

82、t;<p>  //: c12:DirList.java</p><p>  // Displays directory listing using regular expressions.</p><p>  // {Args: "D.*\.java"}</p><p>  import java.io.*;</p>

83、<p>  import java.util.*;</p><p>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;</p><p>  public class DirList {</p><p>  public static void ma

84、in(String[] args) {</p><p>  File path = new File(".");</p><p>  String[] list;</p><p>  if(args.length == 0)</p><p>  list = path.list();</p><p>

85、;<b>  else</b></p><p>  list = path.list(new DirFilter(args[0]));</p><p>  Arrays.sort(list, new AlphabeticComparator());</p><p>  for(int i = 0; i < list.length; i++

86、)</p><p>  System.out.println(list[i]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  class DirFilter implements FilenameFilter {</p><

87、p>  private Pattern pattern;</p><p>  public DirFilter(String regex) {</p><p>  pattern = Pattern.compile(regex);</p><p><b>  }</b></p><p>  public boole

88、an accept(File dir, String name) {</p><p>  // Strip path information, search for regex:</p><p>  return pattern.matcher(</p><p>  new File(name).getName()).matches();</p>&l

89、t;p><b>  }</b></p><p><b>  } ///:~</b></p><p>  The DirFilter class “implements” the interface FilenameFilter. It’s useful to see how simple the FilenameFilter interfa

90、ce is: </p><p>  public interface FilenameFilter {</p><p>  boolean accept(File dir, String name);</p><p><b>  }</b></p><p>  It says all that this type of

91、object does is provide a method called accept( ). The whole reason behind the creation of this class is to provide the accept( ) method to the list( ) method so that list( ) can “call back” accept(

92、60;) to determine which file names should be included in the list. Thus, this structure is often referred to as a callback. More specifically, this is an example of the Strategy Pattern, because list( ) implements b

93、asic functionality, and you provide the Strategy in the form</p><p>  DirFilter shows that just because an interface contains only a set of methods, you’re not restricted to writing only those methods. (You

94、must at least provide definitions for all the methods in an interface, however.) In this case, the DirFilter constructor is also created. </p><p>  The accept( ) method must accept a File object represe

95、nting the directory that a particular file is found in, and a String containing the name of that file. You might choose to use or ignore either of these arguments, but you will probably at least use the file name. Rememb

96、er that the list( ) method is calling accept( ) for each of the file names in the directory object to see which one should be included; this is indicated by the boolean result returned by accept( 

97、;). </p><p>  To make sure the element you’re working with is only the file name and contains no path information, all you have to do is take the String object and create a File object out of it, then call g

98、etName( ), which strips away all the path information (in a platform-independent way). Then accept( ) uses a regular expression matcher object to see if the regular expression regex matches the name of the file

99、. Using accept( ), the list( ) method returns an array. </p><p>  Anonymous inner classes</p><p>  This example is ideal for rewriting using an anonymous inner class (described in Chap

100、ter 8). As a first cut, a method filter( ) is created that returns a reference to a FilenameFilter:</p><p>  //: c12:DirList2.java</p><p>  // Uses anonymous inner classes.</p><p

101、>  // {Args: "D.*\.java"}</p><p>  import java.io.*;</p><p>  import java.util.*;</p><p>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;

102、</p><p>  public class DirList2 {</p><p>  public static FilenameFilter filter(final String regex) {</p><p>  // Creation of anonymous inner class:</p><p>  return new

103、FilenameFilter() {</p><p>  private Pattern pattern = Pattern.compile(regex);</p><p>  public boolean accept(File dir, String name) {</p><p>  return pattern.matcher(</p><

104、;p>  new File(name).getName()).matches();</p><p><b>  }</b></p><p>  }; // End of anonymous inner class</p><p><b>  }</b></p><p>  public sta

105、tic void main(String[] args) {</p><p>  File path = new File(".");</p><p>  String[] list;</p><p>  if(args.length == 0)</p><p>  list = path.list();</p>

106、;<p><b>  else</b></p><p>  list = path.list(filter(args[0]));</p><p>  Arrays.sort(list, new AlphabeticComparator());</p><p>  for(int i = 0; i < list.length;

107、 i++)</p><p>  System.out.println(list[i]);</p><p><b>  }</b></p><p><b>  } ///:~</b></p><p>  Note that the argument to filter( ) must be

108、final. This is required by the anonymous inner class so that it can use an object from outside its scope. </p><p>  This design is an improvement because the FilenameFilter class is now tightly bound to DirL

109、ist2. However, you can take this approach one step further and define the anonymous inner class as an argument to list( ), in which case it’s even smaller:</p><p>  //: c12:DirList3.java</p><

110、p>  // Building the anonymous inner class "in-place."</p><p>  // {Args: "D.*\.java"}</p><p>  import java.io.*;</p><p>  import java.util.*;</p><p

111、>  import java.util.regex.*;</p><p>  import com.bruceeckel.util.*;</p><p>  public class DirList3 {</p><p>  public static void main(final String[] args) {</p><p> 

112、 File path = new File(".");</p><p>  String[] list;</p><p>  if(args.length == 0)</p><p>  list = path.list();</p><p><b>  else</b></p><

113、;p>  list = path.list(new FilenameFilter() {</p><p>  private Pattern pattern = Pattern.compile(args[0]);</p><p>  public boolean accept(File dir, String name) {</p><p>  return

114、pattern.matcher(</p><p>  new File(name).getName()).matches();</p><p><b>  }</b></p><p><b>  });</b></p><p>  Arrays.sort(list, new AlphabeticCo

115、mparator());</p><p>  for(int i = 0; i < list.length; i++)</p><p>  System.out.println(list[i]);</p><p><b>  }</b></p><p><b>  } ///:~</b><

116、;/p><p>  The argument to main( ) is now final, since the anonymous inner class uses args[0] directly. </p><p>  This shows you how anonymous inner classes allow the creation of specific, one-

117、off classes to solve problems. One benefit of this approach is that it keeps the code that solves a particular problem isolated together in one spot. On the other hand, it is not always as easy to read, so you must use i

118、t judiciously. </p><p>  Checking for and creating directories</p><p>  The File class is more than just a representation for an existing file or directory. You can also use a File object to cre

119、ate a new directory or an entire directory path if it doesn’t exist. You can also look at the characteristics of files (size, last modification date, read/write), see whether a File object represents a file or a director

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論