JAVA使用File类对文件进行操作。在很多教程中,我们会同时学到File类和类似FileInputStream这样的流,非常容易将两者混淆。实际上只要掌握了他们的工作原理就不难理解,File类以操作文件的属性和状态为主,而IO流以在两个客户端之间传输数据为主。虽然同是操作文件但出发点是不同的。File类很简单,我们通过实际的例子来学习它的常用API方法。
File类规则约定
当程序接触到底层的操作系统时,一些细小而繁杂的事引起了File类开发者的注意。
他们为了避免将问题复杂化,采用了下面四种约定将JAVA和文件系统在一定程度上良好的结合。
路径名约定
对于 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。
对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\\”。UNC 路径名的前缀是 “\\\\”;主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名没有前缀。
通常,我们在使用windows操作系统下,可以采用”\\”或”/”来表示路径的分隔符,反斜杠需要写两个为了表示转义的意思。
分区约定
此类的实例可能表示(也可能不表示)实际文件系统对象,如文件或目录。如果它表示这种对象,那么该对象驻留在一个分区 中。分区是文件系统特定于操作系统的存储分区。一个存储设备(例如,物理磁盘驱动器、闪存、CD-ROM)可以包含多个分区。对象(如果有)将驻留在此路径名(绝对形式)某个祖先指定的分区上。
权限约定
文件系统可以实现对实际文件系统对象上的某些操作(比如,读、写、执行)进行限制。这些限制统称为访问权限。文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者,另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败。
不可变约定
File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
构造器方法
//1
File f1 =new File("c:\\a\\b.txt");
//2
File f2 =new File("c:\\a","c.txt");
//3
File f3 =new File("c:"+File.separator+"abc");
File f4 =new File(f3,"3.txt");
File类构造方法有4种,其中3种比较常用。
File.separator是File类的一个字段separator,在任何平台中可以充当当前操作系统的文件分隔符。
创建文件方法
public boolean createNewFile( ) throws IOException
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件,这是单个操作,对于其他所有可能影响该文件的文件系统活动来说,该操作是不可分的。
返回:
如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false
public boolean mkdirs( )
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。
返回:
当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false
获取文件信息方法
public File getAbsoluteFile( )
返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。
返回:
绝对抽象路径名,它与此抽象路径名表示相同的文件或目录
public String getName( )
返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。
返回:
此抽象路径名表示的文件或目录的名称;如果路径名的名称序列为空,则返回空字符串
public String getParent( )
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
抽象路径名的父 路径名由路径名的前缀(如果有),以及路径名名称序列中最后一个名称以外的所有名称组成。如果名称序列为空,那么该路径名没有指定父目录。
返回:
此抽象路径名指定父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
getParentFile
public File getParentFile( )
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
抽象路径名的父 路径名由路径名的前缀(如果有),以及路径名名称序列中最后一个名称以外的所有名称组成。如果名称序列为空,那么该路径名没有指定父目录。
返回:
此抽象路径名指定父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null
public long length( )
返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。
返回:
此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。对于表示特定于系统的实体(比如设备或管道)的路径名,某些操作系统可能返回 0L。
判断文件状态方法
public boolean isAbsolute( )
测试此抽象路径名是否为绝对路径名。绝对路径名的定义与系统有关。在 UNIX 系统上,如果路径名的前缀是 “/”,那么该路径名是绝对路径名。在 Microsoft Windows 系统上,如果路径名的前缀是后跟 “\” 的盘符,或者是 “\\\\”,那么该路径名是绝对路径名。
返回:
如果此抽象路径名是绝对路径名,则返回 true;否则返回 false
public boolean isDirectory( )
测试此抽象路径名表示的文件是否是一个目录。
返回:
当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false
public boolean isFile( )
测试此抽象路径名表示的文件是否是一个标准文件。如果该文件不是一个目录,并且满足其他与系统有关的标准,那么该文件是标准 文件。由 Java 应用程序创建的所有非目录文件一定是标准文件。
返回:
当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false
public boolean isHidden( )
测试此抽象路径名指定的文件是否是一个隐藏文件。隐藏 的具体定义与系统有关。在 UNIX 系统上,如果文件名以句点字符 (‘.’) 开头,则认为该文件被隐藏。在 Microsoft Windows 系统上,如果在文件系统中文件被标记为隐藏,则认为该文件被隐藏。
返回:
当且仅当此抽象路径名表示的文件根据底层平台约定是隐藏文件时,返回 true
public boolean canExecute( )
测试应用程序是否可以执行此抽象路径名表示的文件。
返回:
当且仅当抽象路径名存在且 允许应用程序执行文件时返回 true。
public boolean canRead( )
测试应用程序是否可以读取此抽象路径名表示的文件。
返回:
当且仅当此抽象路径名指定的文件存在且 可被应用程序读取时,返回 true;否则返回 false
public boolean canWrite( )
测试应用程序是否可以修改此抽象路径名表示的文件。
返回:
当且仅当文件系统实际包含此抽象路径名表示的文件且 允许应用程序对该文件进行写入时,返回 true;否则返回 false。
public boolean exists( )
测试此抽象路径名表示的文件或目录是否存在。
返回:
当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false
删除文件方法
public boolean delete( )
删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
返回:
当且仅当成功删除文件或目录时,返回 true;否则返回 false
public void deleteOnExit( )
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 文件(或目录)将以与注册相反的顺序删除。调用此方法删除已注册为删除的文件或目录无效。根据 Java 语言规范中的定义,只有在虚拟机正常终止时,才会尝试执行删除操作。
一旦请求了删除操作,就无法取消该请求。所以应小心使用此方法。
操作文件方法
public File[] listFiles( )
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个 File 对象数组,每个数组元素对应目录中的每个文件或目录。表示目录本身及其父目录的名称不包括在结果中。得到的每个抽象路径名都是根据此抽象路径名,使用 File(File, String) 构造方法构造的。所以,如果此路径名是绝对路径名,那么得到的每个路径名都是绝对路径名;如果此路径名是相对路径名,那么得到的每个路径名都是相对于同一目录的路径名。
不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
返回:
抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。
public String toString( )
返回此抽象路径名的路径名字符串。该字符串就是 getPath() 方法返回的字符串。
public String[] list(FilenameFilter filter)返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。如果给定 filter 为 null,则接受所有名称。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该名称才满足过滤器。
返回:
字符串数组,这些字符串指定此抽象路径名表示的目录中给定 filter 能接受的文件和目录。如果目录为空,或者没有名称被过滤器接受,那么该数组将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。
public static File[] listRoots( )
列出可用的文件系统根。
特定 Java 平台可以支持零个或更多个分层组织的文件系统。每个文件系统有一个 root 目录,可以从这里到达文件系统中的所有其他文件。例如,Windows 平台为每个活动驱动器提供了一个根目录;UNIX 平台只有一个根目录,即 “/”。可用文件系统根的设置受各种系统级操作的影响,比如可移动介质的插入和弹出,以及断开或卸载那些物理磁盘或虚拟磁盘。
此方法返回一个 File 对象数组,这些对象表示可用文件系统根的根目录。可以保证本地机器上物理存在的任何文件的规范路径名都以此方法返回的根之一开始。
返回:
表示可用文件系统根的 File 对象数组;如果无法确定根集,则返回 null。如果没有文件系统,那么该数组将为空。