构造一个File类的实例,并不是创建这个目录或文件,而创建的是该路径(目录或文件)的一个抽象,它可能真实存在,也可能不存在。
File类的构造方法有如下四种。
根据parent抽象路径名和child路径名字符串创建一个新File实例。
- File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
- File(String parent, String child)
根据parent路径名字符串和child路径名字符串创建一个新File实例。
- File(URI uri)
通过将给定的URI类对象转换为一个抽象路径名来创建一个新的File实例。
在创建File类的实例时,有个问题尤其需要注意。Java语言一个显著的特点是,Java是跨平台的,可以做到“一次编译、处处运行”,所以在使用File类创建一个路径的抽象时,需要保证创建的这个File类也是跨平台的。但是不同的操作系统对文件路径的设定各有不同的规则,例如在Windows操作系统下,一个文件的路径可能是“C:\com\bd\zuche\TestZuChe.java”,而在Linux和UNIX操作系统下,文件路径的格式就类似于“/home/bd/zuche/TestZuChe.java”。
File类提供了一些静态属性,通过这些静态属性,可以获得Java虚拟机所在操作系统的分隔符相关信息。
- File.pathSeparator
与系统有关的路径分隔符,它被表示为一个字符串。
与系统有关的路径分隔符,它被表示为一个字符。
- File.separator
与系统有关的默认名称分隔符,它被表示为一个字符串。
- File.separatorChar
与系统有关的默认名称分隔符,它被表示为一个字符。
图4.1 File类分隔符
下面通过一个具体的例子来演示File类的一些常用方法,不易理解的代码通过注释加以描述。
编译、运行程序,运行结果如图4.2所示。
图4.2 File类对象的常用方法
程序中的代码for(File root:File.listRoots()){…},通过一个增强for循环,遍历File.listRoots()方法获取的根目录集合(File对象集合)。
f1.createNewFile();是当不存在该文件时,创建一个新的空文件,所以在C:\com\bd\zuche\目录下创建了一个空文件,文件名为Vehicle1.java。另外,这个方法在执行过程中,如果发生I/O错误,会抛出IOException检查时异常,必须要进行显式的捕获或继续向外抛出该异常。
System.out.format(format, args)是使用指定格式化字符串输出,其中format参数为格式化转换符。关于转换符的说明如图4.3所示。
图4.3 转换符说明
从JDK1.5开始,增加了静态导入的特性,用来导入指定类的某个静态属性或方法,或全部静态属性或方法,静态导入使用import static语句。
通过代码对比可以看出,使用静态导入省略了System和Integer的书写,编写代码相对简单。在使用静态导入的时候,需要注意以下几点:
(1)虽然在语言表述上说的是静态导入,但在代码中必须写import static。
(2)提防静态导入冲突。例如,同时对 Integer 类和 Long 类执行了静态导入,引用MAX_VALUE属性将导致一个编译器错误,因为Integer类和Long类都有一个MAX_VALUE常量,编译器不知道使用哪个MAX_VALUE。
(3)虽然静态导入让代码编写相对简单,但毕竟没有完整地写出静态成员所属的类名,程序的可读性有所降低。
在上一小节TestFile代码中,System.out被书写了多次。对于这种情况,建议程序员编写代码时静态导入System类下的out静态变量,这样在之后代码内直接书写out即可代表此静态变量。
File类提供了一些方法,用来返回指定路径下的目录和文件。
- String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
- String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。
- File[] listFiles(FilenameFilter filter)
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
接下来通过一个案例,演示File类的方法的使用,其中FilenameFilter过滤器只需要简单了解即可。
编译、运行程序,其运行结果如图4.4所示。
图4.4 获取目录和文件