//: io/DirList3.java// Building the anonymous inner class "in-place."// {Args: "D.*\.java"}importjava.util.regex.*;importjava.io.*;importjava.util.*;publicclassDirList3{publicstaticvoidmain(finalString[]args){Filepath=newFile(".");String[]list;if(args.length==0)list=path.list();elselist=path.list(newFilenameFilter(){privatePatternpattern=Pattern.compile(args[0]);publicbooleanaccept(Filedir,Stringname){returnpattern.matcher(name).matches();}});Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);for(StringdirItem:list)System.out.println(dirItem);}}/* Output:DirectoryDemo.javaDirList.javaDirList2.javaDirList3.java*///:~
//: net/mindview/util/Directory.java// Produce a sequence of File objects that match a// regular expression in either a local directory,// or by walking a directory tree.packagenet.mindview.util;importjava.util.regex.*;importjava.io.*;importjava.util.*;publicfinalclassDirectory{publicstaticFile[]local(Filedir,finalStringregex){returndir.listFiles(newFilenameFilter(){privatePatternpattern=Pattern.compile(regex);publicbooleanaccept(Filedir,Stringname){returnpattern.matcher(newFile(name).getName()).matches();}});}publicstaticFile[]local(Stringpath,finalStringregex){// Overloadedreturnlocal(newFile(path),regex);}// A two-tuple for returning a pair of objects:publicstaticclassTreeInfoimplementsIterable<File>{publicList<File>files=newArrayList<File>();publicList<File>dirs=newArrayList<File>();// The default iterable element is the file list:publicIterator<File>iterator(){returnfiles.iterator();}voidaddAll(TreeInfoother){files.addAll(other.files);dirs.addAll(other.dirs);}//容器默认的toString()方法会在单个行中打印容器中的所有元素,对于大型集合来说,难以阅读。//PPrint是一个可以添加新行并缩排所有元素的工具publicStringtoString(){return"dirs: "+PPrint.pformat(dirs)+"\n\nfiles: "+PPrint.pformat(files);}}publicstaticTreeInfowalk(Stringstart,Stringregex){// Begin recursionreturnrecurseDirs(newFile(start),regex);}publicstaticTreeInfowalk(Filestart,Stringregex){// OverloadedreturnrecurseDirs(start,regex);}publicstaticTreeInfowalk(Filestart){// EverythingreturnrecurseDirs(start,".*");}publicstaticTreeInfowalk(Stringstart){returnrecurseDirs(newFile(start),".*");}staticTreeInforecurseDirs(FilestartDir,Stringregex){TreeInforesult=newTreeInfo();for(Fileitem:startDir.listFiles()){if(item.isDirectory()){result.dirs.add(item);result.addAll(recurseDirs(item,regex));}else// Regular fileif(item.getName().matches(regex))result.files.add(item);}returnresult;}// Simple validation test:publicstaticvoidmain(String[]args){if(args.length==0)System.out.println(walk("."));elsefor(Stringarg:args)System.out.println(walk(arg));}}///:~//: net/mindview/util/PPrint.java// Pretty-printer for collectionspackagenet.mindview.util;importjava.util.*;publicclassPPrint{publicstaticStringpformat(Collection<?>c){if(c.size()==0)return"[]";StringBuilderresult=newStringBuilder("[");for(Objectelem:c){if(c.size()!=1)result.append("\n ");result.append(elem);}if(c.size()!=1)result.append("\n");result.append("]");returnresult.toString();}publicstaticvoidpprint(Collection<?>c){System.out.println(pformat(c));}publicstaticvoidpprint(Object[]c){System.out.println(pformat(Arrays.asList(c)));}}///:~//: io/DirectoryDemo.java// Sample use of Directory utilities.importjava.io.*;importnet.mindview.util.*;import staticnet.mindview.util.Print.*;publicclassDirectoryDemo{publicstaticvoidmain(String[]args){// All directories:PPrint.pprint(Directory.walk(".").dirs);// All files beginning with 'T'for(Filefile:Directory.local(".","T.*"))print(file);// All Java files beginning with 'T':for(Filefile:Directory.walk(".","T.*\\.java"))print(file);print("======================");// Class files containing "Z" or "z":for(Filefile:Directory.walk(".",".*[Zz].*\\.class"))print(file);}}/* Output: (Sample)[.\xfiles].\TestEOF.class.\TestEOF.java.\TransferTo.class.\TransferTo.java.\TestEOF.java.\TransferTo.java.\xfiles\ThawAlien.java======================.\FreezeAlien.class.\GZIPcompress.class.\ZipCompress.class*///:~
//: net/mindview/util/ProcessFiles.javapackagenet.mindview.util;importjava.io.*;publicclassProcessFiles{publicinterfaceStrategy{voidprocess(Filefile);}privateStrategystrategy;privateStringext;publicProcessFiles(Strategystrategy,Stringext){this.strategy=strategy;this.ext=ext;}publicvoidstart(String[]args){try{if(args.length==0)processDirectoryTree(newFile("."));elsefor(Stringarg:args){FilefileArg=newFile(arg);if(fileArg.isDirectory())processDirectoryTree(fileArg);else{// Allow user to leave off extension:if(!arg.endsWith("."+ext))arg+="."+ext;strategy.process(newFile(arg).getCanonicalFile());}}}catch(IOExceptione){thrownewRuntimeException(e);}}publicvoidprocessDirectoryTree(Fileroot)throwsIOException{for(Filefile:Directory.walk(root.getAbsolutePath(),".*\\."+ext))strategy.process(file.getCanonicalFile());}// Demonstration of how to use it:publicstaticvoidmain(String[]args){newProcessFiles(newProcessFiles.Strategy(){publicvoidprocess(Filefile){System.out.println(file);}},"java").start(args);}}/* (Execute to see output) *///:~
//: io/MakeDirectories.java// Demonstrates the use of the File class to// create directories and manipulate files.// {Args: MakeDirectoriesTest}importjava.io.*;publicclassMakeDirectories{privatestaticvoidusage(){System.err.println("Usage:MakeDirectories path1 ...\n"+"Creates each path\n"+"Usage:MakeDirectories -d path1 ...\n"+"Deletes each path\n"+"Usage:MakeDirectories -r path1 path2\n"+"Renames from path1 to path2");System.exit(1);}privatestaticvoidfileData(Filef){System.out.println("Absolute path: "+f.getAbsolutePath()+"\n Can read: "+f.canRead()+"\n Can write: "+f.canWrite()+"\n getName: "+f.getName()+"\n getParent: "+f.getParent()+"\n getPath: "+f.getPath()+"\n length: "+f.length()+"\n lastModified: "+f.lastModified());//最后修改时间if(f.isFile())System.out.println("It's a file");elseif(f.isDirectory())System.out.println("It's a directory");}publicstaticvoidmain(String[]args){if(args.length<1)usage();if(args[0].equals("-r")){if(args.length!=3)usage();Fileold=newFile(args[1]),rname=newFile(args[2]);old.renameTo(rname);//重命名fileData(old);fileData(rname);return;// Exit main}intcount=0;booleandel=false;if(args[0].equals("-d")){count++;del=true;}count--;while(++count<args.length){Filef=newFile(args[count]);if(f.exists()){System.out.println(f+" exists");if(del){System.out.println("deleting..."+f);f.delete();}}else{// Doesn't existif(!del){f.mkdirs();System.out.println("created "+f);}}fileData(f);}}}/* Output: (80% match)created MakeDirectoriesTestAbsolute path: d:\aaa-TIJ4\code\io\MakeDirectoriesTest Can read: true Can write: true getName: MakeDirectoriesTest getParent: null getPath: MakeDirectoriesTest length: 0 lastModified: 1101690308831It's a directory*///:~
//: io/UsingRandomAccessFile.javaimportjava.io.*;publicclassUsingRandomAccessFile{staticStringfile="rtest.dat";staticvoiddisplay()throwsIOException{RandomAccessFilerf=newRandomAccessFile(file,"r");for(inti=0;i<7;i++)System.out.println("Value "+i+": "+rf.readDouble());System.out.println(rf.readUTF());rf.close();}publicstaticvoidmain(String[]args)throwsIOException{RandomAccessFilerf=newRandomAccessFile(file,"rw");for(inti=0;i<7;i++)rf.writeDouble(i*1.414);rf.writeUTF("The end of the file");rf.close();display();rf=newRandomAccessFile(file,"rw");rf.seek(5*8);rf.writeDouble(47.0001);rf.close();display();}}/* Output:Value 0: 0.0Value 1: 1.414Value 2: 2.828Value 3: 4.242Value 4: 5.656Value 5: 7.069999999999999Value 6: 8.484The end of the fileValue 0: 0.0Value 1: 1.414Value 2: 2.828Value 3: 4.242Value 4: 5.656Value 5: 47.0001Value 6: 8.484The end of the file*///:~