首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

第十一章 文件管理—File种

2012-12-23 
第十一章 文件管理—File类- -Java对于文件系统的操作和管理都是通过File类来实现的。一个File对象可以代表

第十一章 文件管理—File类
-

-

Java对于文件系统的操作和管理都是通过File类来实现的。一个File对象可以代表一个文件,也可以代表一个目录,甚至什么也不是(不存在)。创建了一个File对象后,如果是目录,可以显示目录清单,新建或删除目录;如果是文件,可以查询文件的属性和路径信息,也可以输出和改名,但没有拷贝功能。拷贝属于文件的读写,要用上一章的IO流类来解决。本章就介绍这一个类,它能够解决文件管理的所有问题。-

11.1 数据成员和构建器-

File类的数据成员主要有下列4个,它们都是类变量:-

static String pathSeparator   //";" 路径分隔符,如DOS环境变量PATH中用的分号-

static Char pathSeparatorChar //';' 路径分隔符,字符分号而不是字符串-

static String separator       //"" 路径表达式中的分隔符,如WINDOWS系统中是反斜杠-

static Char separatorChar     //‘\’ 字符型的路径表达式中的分隔符(反斜杠)-

File类的构建器有3个-

public java.io.File(String pathname) -

public java.io.File(String parent,String filename) -

public java.io.File(File parent,String filename) -

第一个构建器通过全路径—路径文件名来创建对象,pathname可以是绝对路径也可以是相对的。第二个构建器通过父目录和文件名来创建对象,filename是不含路径的文件名。第三个构建器也是通过父目录和文件名来创建对象,但父目录由一个File对象提供。-

例1 本例程演示用三种构建器创建File对象。-

///-

import java.io.*;-

class FileCons {-

  public static void main(String[] args) {-

try{-

   File f1 = new File("c:\");-

    File f2 = new File("c:\","windows");-

   File f3 = new File(f1,"sss.txt");-

   File f4 = new File("FileCons.java");-

   File f5 = new File("asdf+?12/");-

   System.out.println("Path of F1 is " + f2.getPath());-

   if (f3.exists())-

       System.out.println(f3 +" exists");-

   else {-

      f3.createNewFile();-

      System.out.println("F3 was created!");-

       }-

   } catch(java.io.IOException e) {-

      e.printStackTrace();-

   }-

  }-

}-

/// -

第一次运行结果:-

Path of F1 is c:\windows-

F3 was created!-

Path of F4 is C:\javacode\zcb\ch11\FileCons.java-

第二次运行结果:-

Path of F1 is c:\windows-

c:\sss.txt exists-

Path of F4 is C:\javacode\zcb\ch11\FileCons.java-

f4说明可以使用相对路径。f5的文件名字符串是非法的,这说明创建对象使4编译程序不分析文件名字符串的合法性,在运行时再掷出异常。-

11.2 显示目录清单-

显示目录清单用list方法,它有两种形式。一种是无参数的,它返回File对象的所有文件和子目录。另一个用过滤器参数,只返回符合条件的文件和子目录列表。-

String[] list()-

String[] list(FilenameFilter filter)-

例2 简单的目录列表,显示当前目录的父目录的清单。-

///-

import java.io.*;-

public class DirList {-

  public static void main(String args[]) {-

   File dir = new File("..");-

   String[] files = null;-

   if(dir.exists())-

      files = dir.list();-

   for (int i=0; i<files.length; i++)-

       System.out.println(files[i]);-

  }-

}-

要使用带过滤器的list方法,必须建立一个类—过滤器filter。这个类要使用FilenameFilter接口。形式如下:-

class DirFilter implements FilenameFilter {-

   String afn;-

   DirFilter(String afn) { this.afn = afn; }-

   public boolean accept(File dir, String name) {-

   // Strip path information:-

   String f = new File(name).getName();-

   return f.indexOf(afn) != -1;-

   }-

}-

///-

构建器DirFilter(String afn),其中字符串afn就是过滤子,包含afn为子串的字符串就是符合条件的。-

例3 带过滤器的目录列表。显示当前目录清单中包含指定字符串的文件和目录。-

///-

import java.io.*;-

public class DirList1 {-

  public static void main(String[] args) {-

  try {File path = new File(".");-

   String[] list;-

   if(args.length == 0)-

       list = path.list();-

   else-

        list = path.list(new DirFilter(args[0]));-

   for(int i = 0; i < list.length; i++)-

      System.out.println(list[i]);-

   } catch(Exception e) {-

      e.printStackTrace();-

   }-

  }-

}-

class DirFilter implements FilenameFilter { ...}-

///-

程序运行时在命令行输入过滤条件,例如要显示所有*.java文件,可用如下方法:-

  java DirList1 java <CR>-

下例用一个匿名内部类来重写例2。首先创建了一个filter()方法,它返回指向FilenameFilter的一个句柄,类体就在创建句柄的地方建立。 -

///-

// DirList2.java-

import java.io.*;-

public class DirList2 {-

  public static FilenameFilter -

  filter(final String afn) {-

    // Creation of anonymous inner class:-

    return new FilenameFilter() {-

      String fn = afn;-

      public boolean accept(File dir, String n) {-

        // Strip path information:-

        String f = new File(n).getName();-

        return f.indexOf(fn) != -1;-

      }-

    }; // End of anonymous inner class-

  }-

  public static void main(String[] args) {-

    try {-

      File path = new File(".");-

      String[] list;-

      if(args.length == 0)-

        list = path.list();-

      else -

        list = path.list(filter(args[0]));-

      for(int i = 0; i < list.length; i++)-

        System.out.println(list[i]);-

    } catch(Exception e) {-

      e.printStackTrace();-

    }-

  }-

}-

/// -

利用过滤器筛选文件清单-

筛选目录中的文件清单用listFiles方法,它返回的是File类型的对象数组。语法形式与list方法类似,不过它使用了两种过滤器—文件名过滤器和文件过滤器作为参数。这三个方法是:-

File[] listFiles()-

File[] listFiles(FilenameFilter)-

File[] listFiles(FileFilter)-

例3 显示任意目录的子目录(或文件)清单,任意目录从命令行输入,缺省为当前目录。-

///-

import java.io.*;-

public class DirList3 {-

  public static void main(String args[]){-

   File dir ;-

   dir = new File(args.length == 0? "." : args[0] );-

   File[] files = null;-

   if(dir.exists())-

        files = dir.listFiles();-

   for (int i=0; i<files.length; i++)-

        if(files[i].isDirectory()) // OR isFile()-

            System.out.println(files[i].getName());-

  }-

}-

///-

例如运行:DirList3 c:\ ,就显示C盘根目录的所有子目录。把isDirectory()改为isFile(),就显示文件而不包含子目录。请有不同的目录名运行本程序,包括相对路径"..",".",""等相对路径。我们可以通过在命令行上增加一个选项(-d , -f, -a)的方法,使程序能够兼顾显示目录、文件和全部。这个题目留给读者自己来完成。-

由于现在用命令行参数使得例程越来越灵活,而且运行结果依赖于硬盘上具体的文件系统,所以运行的输出结果对读者没有参考价值,所以不再列出了。以后在没有不确定性的情况下还会列出的。-

listFiles方法的第二个用法可参考例2。下面介绍第三个方法——使用文件过滤器。-

例4 本例程演示listFiles(FileFilter)方法。-

///-

import java.io.*;-

  public class DirList4 {-

   public static void main(String[] args) {-

   try {-

       File path = new File(".");-

      File[] list;-

       list = path.listFiles(new Filter("java"));-

      for(int i = 0; i < list.length; i++)-

           System.out.println(list[i]);-

   } catch(Exception e) {-

      e.printStackTrace();-

   }-

  }-

}-

class Filter implements FileFilter {-

   File f;-

   String sf;-

   Filter(String filter) {-

   this.sf = filter;-

   }-

   public boolean accept(File f) {-

     String s = f.getName();-

     return s.indexOf(sf) != -1 ;-

}-

}-

///-

本例程显示当前目录中的所用*.java文件。也可以用它过滤目录名或文件名。例如把过滤子改为如下形状:-

class Filter implements FileFilter {-

   File f;-

   Filter() { }-

   public boolean accept(File f) {-

    return f.Directory() ;-

}-

}-

accept方法体可以复杂化,因此利用文件过滤器可以创建更为复杂的过滤条件。-

11.3 创建和删除-

利用File对象可以很方便地创建和删除目录,也可以创建一个空文件和删除文件。这些方法都返回boolean值以告知操作是否成功。方法列表如下:-

boolean mkdir()          创建一个新目录-

boolean createNewFile()  创建一个新的空文件-

boolean delete()         删除一个空目录或文件-

boolean renameTo(File)   目录或文件改名-

如果要删除的目录非空,就掷出一个IO异常。如果要删除的文件或目录不存在则不吱声。如果要创建的空文件名已经存在,也掷出异常。下面的例程演示创建工作。-

例5 创建一个“根目录”九个子目录,并在每个子目录中创建一个空文件。-

///-

import java.io.*;-

class DirCreate {-

  public static void main(String[] args) {-

   File root = new File("c:\\root$dir");-

    File[] dirs = new File[10];-

   File[] fs = new File[10];-

   try{-

   if (!root.exists()) root.mkdir();-

   for (int i=1; i<10;i++) {-

       dirs[i] = new File(root, "Dir" + String.valueOf(i));-

      dirs[i].mkdir();-

      fs[i] = new File(dirs[i],"file" + String.valueOf(i));-

      fs[i].createNewFile();-

   }-

   } catch(IOException e) {-

      e.printStackTrace();-

   }-

  }-

}-

///-

执行完后请观看结果。然后执行下面的删除程序。-

例6 删除上例建立的所有子目录和文件,留下”根目录“并改名。-

///-

import java.io.*;-

class DirDelete {-

  public static void main(String[] args) {-

   File root = new File("c:\\root$dir");-

    File[] dirs = new File[10];-

   File[] fs = new File[10];-

   for (int i=1; i<10;i++) {-

      dirs[i] = new File(root, "Dir" + String.valueOf(i));-

     fs[i] = new File(dirs[i],"file" + String.valueOf(i));-

     fs[i].delete();-

     dirs[i].delete();-

   }-

   File r = new File("c:\\root$$$");-

    root.renameTo(r);-

   }-

}-

}-

///-

11.4 文件属性测试-

File类提供了许多方法给出File对象所对应的文件的各种属性。其中一类是判断性的,大多数无参数都返回boolean值。这些方法有:-

canRead()        可读否?-

canWrite()       可写否? -

exists()         File对象存在吗?-

isDirectory()    是目录吗?-

isFile()         是文件吗?-

isAbsolute()     有File(parent, filename)构建器创建对象时给出的是绝对路径吗?    -

isHidden()       是隐含文件吗? -

SetReadOnly()    是只读文件吗?-

另一类返回字符串,如文件名和路径等。它们有:-

getName()      不含路径的文件名-

getPath()      路径文件名-

getParent()    父目录名-

getAbsolute()  返回绝对路径-

toString()     返回File对象的信息-

最后还有几个方法是:-

long length()          返回文件程度(字节数)-

long lastModified()    返回文件的最后修改时间-

int compareTo(File f)  比较两个File对象,而不是比较文件内容  -

boolean equals(Object o)  自Object类继承而来的方法-

下面我们有一个程序来演示所有这些方法的用法。-

例7 测试或获取文件属性信息。-

///-

import java.io.*;-

import java.util.Date;-

public class File1Properties {-

  static void printProperty(File file) {-

   System.out.println("Name: " + file.getName());-

   System.out.println("Path: " + file.getPath());-

   System.out.println("Parent: " + file.getParent());-

   System.out.println("Can read? " + file.canRead());-

   System.out.println("Can write? " + file.canWrite());-

   System.out.println("Is hidden? " + file.isHidden());-

   System.out.println("Is readonly? " + file.setReadOnly());-

   System.out.println("Length: " + file.length());-

   Date date = new Date(file.lastModified());-

   System.out.println("Iast modified: " + date.toString());-

   System.out.println();-

   System.out.println("Is Absolute? " + file.isAbsolute());-

   System.out.println("AbsolutePath: " + file.getAbsolutePath());-

   }-

public static void main(String args[]){-

   if(args.length ==0) {-

   System.out.println("Usage: File1Properties <filename>");-

   System.exit(0);-

   }-

   File f = new File(args[0]);-

   if(!f.exists())-

       System.out.println(f.toString() +" not exists!");-

   else {-

      if(f.isDirectory())-

           System.out.println("This is a directory");-

      else-

           [ft=#000-

热点排行