javaIO—File类详解

先列出APi,然后讲解File类的基本知识及实例。

java.io

类 File

java.lang.Object

java.io.File

所有已实现的接口:

SerializableComparable<File>


public class File

extends Object

implements SerializableComparable<File>

文件和目录路径名的抽象表示形式。

用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。抽象路径名 有两个组件:

  1. 一个可选的与系统有关的前缀 字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名。
  2. 零个或更多字符串名称 的序列。

抽象路径名中的第一个名称是目录名,对于 Microsoft Windows UNC 路径名则是主机名。抽象路径名中第一个名称之后的每个名称表示一个目录;最后一个名称既可以表示目录,也可以表示文件。抽象路径名没有前缀和名称序列。

路径名字符串与抽象路径名之间的转换与系统有关。将抽象路径名转换为路径名字符串时,每个名称与下一个名称之间用一个默认分隔符隔开。默认名称分隔符由系统属性 file.separator 定义,可通过此类的公共静态字段 separatorseparatorChar使其可用。将路径名字符串转换为抽象路径名时,可以使用默认名称分隔符或者底层系统支持的任何其他名称分隔符来分隔其中的名称。

无论是抽象路径名还是路径名字符串,都可以是绝对路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。相反,相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性user.dir 指定,通常是 Java 虚拟机的调用目录。

调用此类的 getParent()方法可以获取抽象路径名的 路径名,它由路径名前缀以及路径名名称序列中的每个名称(最后一个除外)组成。对于任何具有绝对抽象路径名的 File 对象,如果其绝对抽象路径名以某个目录的绝对路径名开头,那么该目录的绝对路径名是该 File 对象的祖先。例如,抽象路径名 "/usr" 表示的目录是路径名 "/usr/local/bin" 所表示目录的一个祖先。

在处理 UNIX 平台的根目录,以及 Microsoft Windows 平台的盘符、根目录和 UNC 路径名时,将用到前缀这一概念。如下所示:

  • 对于 UNIX 平台,绝对路径名的前缀始终是 "/"。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 "/" 且名称序列为空。
  • 对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 ":" 组成。如果路径名是绝对路径名,还可能后跟 "\\"。UNC 路径名的前缀是 "\\\\";主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名没有前缀。

此类的实例可能表示(也可能不表示)实际文件系统对象,如文件或目录。如果它表示这种对象,那么该对象驻留在一个分区中。分区是文件系统特定于操作系统的存储分区。一个存储设备(例如,物理磁盘驱动器、闪存、CD-ROM)可以包含多个分区。对象(如果有)将驻留在此路径名(绝对形式)某个祖先指定的分区上。

文件系统可以实现对实际文件系统对象上的某些操作(比如,读、写、执行)进行限制。这些限制统称为访问权限。文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者,另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败。

File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。

从以下版本开始:

JDK1.0

另请参见:

序列化表格



字段摘要


staticString


pathSeparator

与系统有关的路径分隔符,为了方便,它被表示为一个字符串。


static char


pathSeparatorChar

与系统有关的路径分隔符。


staticString


separator

与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。


static char


separatorChar

与系统有关的默认名称分隔符。


构造方法摘要


File(File parent, String child)

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。


File(String pathname)

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。


File(String parent, String child)

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。


File(URI uri)

通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。


方法摘要


boolean


canExecute()

测试应用程序是否可以执行此抽象路径名表示的文件。


boolean


canRead()

测试应用程序是否可以读取此抽象路径名表示的文件。


boolean


canWrite()

测试应用程序是否可以修改此抽象路径名表示的文件。


int


compareTo(File pathname)

按字母顺序比较两个抽象路径名。


boolean


createNewFile()

当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。


staticFile


createTempFile(String prefix, String suffix)

在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。


staticFile


createTempFile(String prefix, String suffix, File directory)

在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。


boolean


delete()

删除此抽象路径名表示的文件或目录。


void


deleteOnExit()

在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。


boolean


equals(Object obj)

测试此抽象路径名与给定对象是否相等。


boolean


exists()

测试此抽象路径名表示的文件或目录是否存在。


File


getAbsoluteFile()

返回此抽象路径名的绝对路径名形式。


String


getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。


File


getCanonicalFile()

返回此抽象路径名的规范形式。


String


getCanonicalPath()

返回此抽象路径名的规范路径名字符串。


long


getFreeSpace()

返回此抽象路径名指定的分区中未分配的字节数。


String


getName()

返回由此抽象路径名表示的文件或目录的名称。


String


getParent()

返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。


File


getParentFile()

返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。


String


getPath()

将此抽象路径名转换为一个路径名字符串。


long


getTotalSpace()

返回此抽象路径名指定的分区大小。


long


getUsableSpace()

返回此抽象路径名指定的分区上可用于此虚拟机的字节数。


int


hashCode()

计算此抽象路径名的哈希码。


boolean


isAbsolute()

测试此抽象路径名是否为绝对路径名。


boolean


isDirectory()

测试此抽象路径名表示的文件是否是一个目录。


boolean


isFile()

测试此抽象路径名表示的文件是否是一个标准文件。


boolean


isHidden()

测试此抽象路径名指定的文件是否是一个隐藏文件。


long


lastModified()

返回此抽象路径名表示的文件最后一次被修改的时间。


long


length()

返回由此抽象路径名表示的文件的长度。


String[]


list()

返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。


String[]


list(FilenameFilter filter)

返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。


File[]


listFiles()

返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。


File[]


listFiles(FileFilter filter)

返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。


File[]


listFiles(FilenameFilter filter)

返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。


staticFile[]


listRoots()

列出可用的文件系统根。


boolean


mkdir()

创建此抽象路径名指定的目录。


boolean


mkdirs()

创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。


boolean


renameTo(File dest)

重新命名此抽象路径名表示的文件。


boolean


setExecutable(boolean executable)

设置此抽象路径名所有者执行权限的一个便捷方法。


boolean


setExecutable(boolean executable, boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的执行权限。


boolean


setLastModified(long time)

设置此抽象路径名指定的文件或目录的最后一次修改时间。


boolean


setReadable(boolean readable)

设置此抽象路径名所有者读权限的一个便捷方法。


boolean


setReadable(boolean readable, boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的读权限。


boolean


setReadOnly()

标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。


boolean


setWritable(boolean writable)

设置此抽象路径名所有者写权限的一个便捷方法。


boolean


setWritable(boolean writable, boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的写权限。


String


toString()

返回此抽象路径名的路径名字符串。


URI


toURI()

构造一个表示此抽象路径名的 file: URI。


URL


toURL()

已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。


从类 java.lang.Object 继承的方法


clonefinalizegetClassnotifynotifyAllwaitwaitwait


字段详细信息

separatorChar

public static final char separatorChar

与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 ‘/‘;在 Microsoft Windows 系统上,它为 ‘\\‘。

另请参见:

System.getProperty(java.lang.String)


separator

public static final String separator

与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即separatorChar


pathSeparatorChar

public static final char pathSeparatorChar

与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ‘:‘;在Microsoft Windows 系统上,它为 ‘;‘。

另请参见:

System.getProperty(java.lang.String)


pathSeparator

public static final String pathSeparator

与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即pathSeparatorChar


构造方法详细信息

File

public File(String pathname)

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,那么结果是空抽象路径名。

参数:

pathname - 路径名字符串

抛出:

NullPointerException - 如果 pathname 参数为 null


File

public File(String parent,

String child)

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

如果 parent 为 null,则创建一个新的 File 实例,这与调用以给定 child 路径名字符串作为参数的单参数 File构造方法效果一样。

否则,parent 路径名字符串用于表示目录,child 路径名字符串用于表示目录或文件。如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。如果 parent 是空字符串,则通过将 child 转换为抽象路径名,并根据与系统有关的默认目录解析结果来创建新的 File 实例。否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。

参数:

parent - 父路径名字符串

child - 子路径名字符串

抛出:

NullPointerException - 如果 child 为 null


File

public File(File parent,

String child)

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

如果 parent 为 null,则创建一个新的 File 实例,这与调用给定 child 路径名字符串的单参数 File 构造方法的效果一样。

否则,parent 抽象路径名用于表示目录,child 路径名字符串用于表示目录或文件。如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。如果 parent 是空抽象路径名,则通过将 child 转换为抽象路径名,并根据与系统有关的默认目录解析结果来创建新的 File 实例。否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。

参数:

parent - 父抽象路径名

child - 子路径名字符串

抛出:

NullPointerException - 如果 child 为 null


File

public File(URI uri)

通过将给定的 file: URI转换为一个抽象路径名来创建一个新的 File 实例。

file: URI 的具体形式与系统有关,因此,由此构造方法执行的转换也与系统有关。

对于某个给定抽象路径名 f,可以保证:

new File( f.toURI()).equals(f.getAbsoluteFile())

只要原始抽象路径名、URI 和新抽象路径名都是在同一 Java 虚拟机(或者它的不同调用)中创建的。但是,当在某一操作系统上的虚拟机中创建的file: URI 在不同操作系统上的虚拟机中被转换为抽象路径名时,这种关系通常是不成立的。

参数:

uri - 一个绝对分层 URI,由一个等于 "file"的 scheme、非空的 path 组件,以及未定义的 authority、query 和fragment 组件组成

抛出:

NullPointerException - 如果 uri 为 null

IllegalArgumentException - 如果关于参数的前提不成立

从以下版本开始:

1.4

另请参见:

toURI(),URI


方法详细信息

getName

public String getName()

返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。

返回:

此抽象路径名表示的文件或目录的名称;如果路径名的名称序列为空,则返回空字符串


getParent

public String getParent()

返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

抽象路径名的 路径名由路径名的前缀(如果有),以及路径名名称序列中最后一个名称以外的所有名称组成。如果名称序列为空,那么该路径名没有指定父目录。

返回:

此抽象路径名指定父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null


getParentFile

public File getParentFile()

返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。

抽象路径名的 路径名由路径名的前缀(如果有),以及路径名名称序列中最后一个名称以外的所有名称组成。如果名称序列为空,那么该路径名没有指定父目录。

返回:

此抽象路径名指定父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null

从以下版本开始:

1.2


getPath

public String getPath()

将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。

返回:

此抽象路径名的字符串形式


isAbsolute

public boolean isAbsolute()

测试此抽象路径名是否为绝对路径名。绝对路径名的定义与系统有关。在 UNIX 系统上,如果路径名的前缀是 "/",那么该路径名是绝对路径名。在 Microsoft Windows 系统上,如果路径名的前缀是后跟"\\" 的盘符,或者是"\\\\",那么该路径名是绝对路径名。

返回:

如果此抽象路径名是绝对路径名,则返回 true;否则返回 false


getAbsolutePath

public String getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。

如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath()方法一样。如果此抽象路径名是空抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir指定。否则,使用与系统有关的方式解析此路径名。在 UNIX 系统上,根据当前用户目录解析相对路径名,可使该路径名成为绝对路径名。在 Microsoft
Windows 系统上,根据路径名指定的当前驱动器目录(如果有)解析相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录解析它。

返回:

绝对路径名字符串,它与此抽象路径名表示相同的文件或目录

抛出:

SecurityException - 如果无法访问所需的系统属性值。

另请参见:

isAbsolute()


getAbsoluteFile

public File getAbsoluteFile()

返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。

返回:

绝对抽象路径名,它与此抽象路径名表示相同的文件或目录

抛出:

SecurityException - 如果无法访问所需的系统属性值。

从以下版本开始:

1.2


getCanonicalPath

public String getCanonicalPath()

throws IOException

返回此抽象路径名的规范路径名字符串。

规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换为绝对路径名,这与调用 getAbsolutePath()方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如"." 和 "..")、解析符号连接(对于 UNIX 平台),以及将驱动器号转换为标准大小写形式(对于 MicrosoftWindows 平台)。

每个表示现存文件或目录的路径名都有一个惟一的规范形式。每个表示不存在文件或目录的路径名也有一个惟一的规范形式。不存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

返回:

规范路径名字符串,它与此抽象路径名表示相同的文件或目录

抛出:

IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)

SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其SecurityManager.checkRead(java.io.FileDescriptor)方法拒绝对文件进行读访问

从以下版本开始:

JDK1.1


getCanonicalFile

public File getCanonicalFile()

throws IOException

返回此抽象路径名的规范形式。等同于 new File(this.getCanonicalPath())。

返回:

规范路径名字符串,它与此抽象路径名表示相同的文件或目录

抛出:

IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)

SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其SecurityManager.checkRead(java.io.FileDescriptor)方法拒绝对文件进行读访问

从以下版本开始:

1.2


toURL

@Deprecated

public URL toURL()

throws MalformedURLException

已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过toURI方法将其转换为 URI,然后通过 URI.toURL方法将 URI 装换为 URL。

将此抽象路径名转换为一个file: URL。该 URL 的具体形式与系统有关。如果可以确定此抽象路径名表示的文件是一个目录,那么所得 URL 将以斜杠结束。

返回:

表示等价文件 URL 的 URL 对象

抛出:

MalformedURLException - 如果无法将路径解析为 URL

从以下版本开始:

1.2

另请参见:

toURI(),URIURI.toURL(),URL


toURI

public URI toURI()

构造一个表示此抽象路径名的file: URI。

该 URI 的具体形式与系统有关。如果可以确定此抽象路径名表示的文件是一个目录,那么所得 URI 将以斜杠结束。

对于某个给定抽象路径名 f,可保证:

new File(f.toURI()).equals( f.getAbsoluteFile())

只要原始抽象路径名、URI 和新抽象路径名都是在同一 Java 虚拟机(或者它的不同调用)中创建的。但是,由于抽象路径名与系统有关的特性,当在某一操作系统上的虚拟机中创建的 file: URI 在不同操作系统上的虚拟机中被转换为抽象路径名时,这种关系通常是不成立的。

返回:

一个绝对分层 URI,由一个等于 "file" 的 scheme、表示此抽象路径名的 path,以及未定义的 authority、query和 fragment 组件组成

抛出:

SecurityException - 如果不能访问请求的系统属性值。

从以下版本开始:

1.4

另请参见:

File(java.net.URI),URIURI.toURL()


canRead

public boolean canRead()

测试应用程序是否可以读取此抽象路径名表示的文件。

返回:

当且仅当此抽象路径名指定的文件存在 可被应用程序读取时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问


canWrite

public boolean canWrite()

测试应用程序是否可以修改此抽象路径名表示的文件。

返回:

当且仅当文件系统实际包含此抽象路径名表示的文件 允许应用程序对该文件进行写入时,返回 true;否则返回false。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问


exists

public boolean exists()

测试此抽象路径名表示的文件或目录是否存在。

返回:

当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件或目录进行写访问


isDirectory

public boolean isDirectory()

测试此抽象路径名表示的文件是否是一个目录。

返回:

当且仅当此抽象路径名表示的文件存在 是一个目录时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问


isFile

public boolean isFile()

测试此抽象路径名表示的文件是否是一个标准文件。如果该文件不是一个目录,并且满足其他与系统有关的标准,那么该文件是标准文件。由 Java 应用程序创建的所有非目录文件一定是标准文件。

返回:

当且仅当此抽象路径名表示的文件存在 是一个标准文件时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问


isHidden

public boolean isHidden()

测试此抽象路径名指定的文件是否是一个隐藏文件。隐藏 的具体定义与系统有关。在 UNIX 系统上,如果文件名以句点字符 (‘.‘) 开头,则认为该文件被隐藏。在 Microsoft Windows 系统上,如果在文件系统中文件被标记为隐藏,则认为该文件被隐藏。

返回:

当且仅当此抽象路径名表示的文件根据底层平台约定是隐藏文件时,返回 true

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问

从以下版本开始:

1.2


lastModified

public long lastModified()

返回此抽象路径名表示的文件最后一次被修改的时间。

返回:

表示文件最后一次被修改的时间的long 值,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示;如果该文件不存在,或者发生 I/O 错误,则返回 0L

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问


length

public long length()

返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。

返回:

此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。对于表示特定于系统的实体(比如设备或管道)的路径名,某些操作系统可能返回 0L。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对文件进行读访问


createNewFile

public boolean createNewFile()

throws IOException

当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件,这是单个操作,对于其他所有可能影响该文件的文件系统活动来说,该操作是不可分的。

注:此方法不应该 用于文件锁定,因为所得协议可能无法可靠地工作。应该使用 FileLock 机制替代。

返回:

如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false

抛出:

IOException - 如果发生 I/O 错误

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问

从以下版本开始:

1.2


delete

public boolean delete()

删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。

返回:

当且仅当成功删除文件或目录时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkDelete(java.lang.String)方法拒绝对文件进行删除访问


deleteOnExit

public void deleteOnExit()

在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 文件(或目录)将以与注册相反的顺序删除。调用此方法删除已注册为删除的文件或目录无效。根据 Java 语言规范中的定义,只有在虚拟机正常终止时,才会尝试执行删除操作。

一旦请求了删除操作,就无法取消该请求。所以应小心使用此方法。

注:此方法不应该 用于文件锁定,因为所得协议可能无法可靠地工作。应该使用 FileLock 设施替代。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkDelete(java.lang.String)方法拒绝对文件进行删除访问

从以下版本开始:

1.2

另请参见:

delete()


list

public String[] list()

返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个字符串数组,每个数组元素对应目录中的每个文件或目录。表示目录本身及其父目录的名称不包括在结果中。每个字符串是一个文件名,而不是一条完整路径。

不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。

返回:

字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果此抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对目录进行读访问


list

public String[] list(FilenameFilter filter)

返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与list()方法相同。如果给定 filter 为 null,则接受所有名称。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的FilenameFilter.accept(java.io.File,java.lang.String) 方法返回 true 时,该名称才满足过滤器。

参数:

filter - 文件名过滤器

返回:

字符串数组,这些字符串指定此抽象路径名表示的目录中给定 filter 能接受的文件和目录。如果目录为空,或者没有名称被过滤器接受,那么该数组将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对目录进行读访问


listFiles

public File[] listFiles()

返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个 File 对象数组,每个数组元素对应目录中的每个文件或目录。表示目录本身及其父目录的名称不包括在结果中。得到的每个抽象路径名都是根据此抽象路径名,使用File(File,String) 构造方法构造的。所以,如果此路径名是绝对路径名,那么得到的每个路径名都是绝对路径名;如果此路径名是相对路径名,那么得到的每个路径名都是相对于同一目录的路径名。

不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。

返回:

抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对目录进行读访问

从以下版本开始:

1.2


listFiles

public File[] listFiles(FilenameFilter filter)

返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与listFiles()方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的FilenameFilter.accept(java.io.File,java.lang.String) 方法返回 true 时,该路径名才满足过滤器。

参数:

filter - 文件名过滤器

返回:

抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果此抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对目录进行读访问

从以下版本开始:

1.2


listFiles

public File[] listFiles(FileFilter filter)

返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与listFiles()方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的FileFilter.accept(java.io.File)方法返回 true 时,该路径名才满足过滤器。

参数:

filter - 文件过滤器

返回:

抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对目录进行读访问

从以下版本开始:

1.2


mkdir

public boolean mkdir()

创建此抽象路径名指定的目录。

返回:

当且仅当已创建目录时,返回true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法不允许创建指定的目录


mkdirs

public boolean mkdirs()

创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。

返回:

当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法不允许验证指定目录和所有必需的父目录是否存在;或者 SecurityManager.checkWrite(java.lang.String)方法不允许创建指定的目录和所有必需的父目录


renameTo

public boolean renameTo(File dest)

重新命名此抽象路径名表示的文件。

此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。

参数:

dest - 指定文件的新抽象路径名

返回:

当且仅当重命名成功时,返回true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法拒绝对原路径名和新路径名进行写访问

NullPointerException - 如果参数 dest 为 null


setLastModified

public boolean setLastModified(long time)

设置此抽象路径名指定的文件或目录的最后一次修改时间。

所有平台都支持将文件修改时间设置为最接近的秒数,而且一些平台会提供更精确的值。该参数将被截取,以满足受支持的精度。如果该操作成功,并且没有在文件上发生其他干扰操作,则下一次调用lastModified()方法将返回传递给此方法的 time 参数(可能被截取)。

参数:

time - 新的最后一次修改时间,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示

返回:

当且仅当该操作成功时,返回true;否则返回 false

抛出:

IllegalArgumentException - 如果该参数为负

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法拒绝对指定文件进行写访问

从以下版本开始:

1.2


setReadOnly

public boolean setReadOnly()

标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。调用此方法后,可以保证在被删除或被标记为允许写访问之前,文件或目录不会发生更改。是否可以删除某个只读文件或目录则取决于底层系统。

返回:

当且仅当该操作成功时,返回true;否则返回 false

抛出:

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法拒绝对指定文件进行写访问

从以下版本开始:

1.2


setWritable

public boolean setWritable(boolean writable,

boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的写权限。

参数:

writable - 如果为 true,则设置允许写操作的访问权限;如果为 false,则不允许写操作。

ownerOnly - 如果为 true,则写权限只适用于所有者的写权限;否则适用于所有用户。如果底层文件系统不能区分所有者写权限与其他写权限,那么无论该参数为何值,写权限将适用于所有用户。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对指定文件进行写访问。

从以下版本开始:

1.6


setWritable

public boolean setWritable(boolean writable)

设置此抽象路径名所有者写权限的一个便捷方法。

此方法 file.setWritable(arg) 形式的调用与以下调用的行为完全相同:

file.setWritable(arg, true)

参数:

writable - 如果为 true,则设置允许写操作的访问权限;如果为 false,则不允许写操作。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问。

从以下版本开始:

1.6


setReadable

public boolean setReadable(boolean readable,

boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的读权限。

参数:

readable - 如果为 true,则设置允许读操作的访问权限;如果为 false,则不允许读操作。

ownerOnly - 如果为 true,则读权限只适用于所有者的读权限;否则适用于所有用户。如果底层文件系统不能区分所有者读权限与其他读权限,那么无论该参数为何值,读权限将适用于所有用户。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。如果readable 为 false,并且底层文件系统不实现读权限,那么操作也将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问。

从以下版本开始:

1.6


setReadable

public boolean setReadable(boolean readable)

设置此抽象路径名所有者读权限的一个便捷方法。

此方法 file.setReadable(arg) 形式的调用与以下调用的行为完全相同:

file.setReadable(arg, true)

参数:

readable - 如果为 true,则设置允许读操作的访问权限;如果为 false,则不允许读操作。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。如果readable 为 false,并且底层文件系统不实现读权限,那么操作也将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问。

从以下版本开始:

1.6


setExecutable

public boolean setExecutable(boolean executable,

boolean ownerOnly)

设置此抽象路径名的所有者或所有用户的执行权限。

参数:

executable - 如果为 true,则设置允许执行操作的访问权限;如果为 false,则不允许执行操作。

ownerOnly - 如果为 true,则执行权限只适用于所有者的执行权限;否则适用于所有用户。如果底层文件系统不能区分所有者执行权限与其他执行权限,那么无论该参数为何值,执行权限将适用于所有用户。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。如果executable 为 false,并且底层文件系统不实现执行权限,那么操作也将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问。

从以下版本开始:

1.6


setExecutable

public boolean setExecutable(boolean executable)

设置此抽象路径名所有者执行权限的一个便捷方法。

此方法 file.setExcutable(arg) 形式的调用与以下调用的行为完全相同:

file.setExecutable(arg, true)

参数:

executable - 如果为 true,则设置允许执行操作的访问权限;如果为 false,则不允许执行操作。

返回:

当且仅当操作成功时返回 true。如果用户不具有更改此抽象路径名访问权限的权限,那么操作将失败。如果executable 为 false,并且底层文件系统不实现执行权限,那么操作也将失败。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkWrite(java.lang.String)方法拒绝对文件进行写访问。

从以下版本开始:

1.6


canExecute

public boolean canExecute()

测试应用程序是否可以执行此抽象路径名表示的文件。

返回:

当且仅当抽象路径名存在 允许应用程序执行文件时返回 true。

抛出:

SecurityException - 如果安全管理器存在且其SecurityManager.checkExec(java.lang.String)方法拒绝对文件进行执行访问。

从以下版本开始:

1.6


listRoots

public static File[] listRoots()

列出可用的文件系统根。

特定 Java 平台可以支持零个或更多个分层组织的文件系统。每个文件系统有一个 root 目录,可以从这里到达文件系统中的所有其他文件。例如,Windows 平台为每个活动驱动器提供了一个根目录;UNIX 平台只有一个根目录,即"/"。可用文件系统根的设置受各种系统级操作的影响,比如可移动介质的插入和弹出,以及断开或卸载那些物理磁盘或虚拟磁盘。

此方法返回一个 File 对象数组,这些对象表示可用文件系统根的根目录。可以保证本地机器上物理存在的任何文件的规范路径名都以此方法返回的根之一开始。

位于其他一些机器上的文件的规范路径名是通过远程文件系统协议(比如 SMB 或 NFS)访问的,它们可能以此方法返回的根之一开始,也可能不是这样。如果远程文件的路径名在语法上无法与本地文件的路径名进行区分,那么它将以此方法返回的根之一开始。例如,此方法将返回表示 Windows 平台上映射为网络驱动器根目录的 File 对象,而不返回包含 UNC 路径名的 File 对象。

与此类中的大多数方法不同,此方法不抛出安全性异常。如果存在安全管理器,且其SecurityManager.checkRead(java.lang.String)方法拒绝对特定根目录进行读访问,那么该目录将不会出现在结果中。

返回:

表示可用文件系统根的 File 对象数组;如果无法确定根集,则返回 null。如果没有文件系统,那么该数组将为空。

从以下版本开始:

1.2


getTotalSpace

public long getTotalSpace()

返回此抽象路径名指定的分区大小。

返回:

分区的大小,以字节为单位;如果此抽象路径名没有指定分区,则返回 0L。

抛出:

SecurityException - 如果安装了安全管理器,并且安全管理器拒绝RuntimePermission("getFileSystemAttributes"),或者其SecurityManager.checkRead(String)方法拒绝对此抽象路径名指定的文件进行读访问

从以下版本开始:

1.6


getFreeSpace

public long getFreeSpace()

返回此抽象路径名指定的分区中未分配的字节数。

返回的未分配字节数是一个提示,而不是一个保证,只能使用这些字节的一部分。未分配字节数很可能在此调用后立即与实际相符。某些外部 I/O 操作可能使其与实际不符,这些操作包括那些在此虚拟机外部系统上进行的操作。此方法不保证对此文件系统的写操作将成功。

返回:

分区上的未分配字节数;如果抽象路径名没有指定分区,则返回 0L。返回值将小于等于 getTotalSpace()返回的总文件系统大小。

抛出:

SecurityException - 如果安装了安全管理器,并且安全管理器拒绝RuntimePermission("getFileSystemAttributes"),或者其SecurityManager.checkRead(String)方法拒绝对此抽象路径名指定的文件进行读访问

从以下版本开始:

1.6


getUsableSpace

public long getUsableSpace()

返回此抽象路径名指定的分区上可用于此虚拟机的字节数。若有可能,此方法将检查写权限和其他操作系统限制,因此与getFreeSpace()相比,此方法能更准确地估计可实际写入的新数据数。

返回的可用字节数是一个提示,而不是一个保证,只能使用这些字节的一部分。未分配字节数很可能在此调用后立即与实际相符。某些外部 I/O 操作可能使其与实际不符,这些操作包括那些在此虚拟机外部系统上进行的操作。此方法不保证对此文件系统的写操作将成功。

返回:

分区上的可用字节数;如果抽象路径名没有指定分区,则返回 0L。在此信息不可用的系统上,此方法等效于调用getFreeSpace()

抛出:

SecurityException - 如果安装了安全管理器,并且安全管理器拒绝RuntimePermission("getFileSystemAttributes"),或者其SecurityManager.checkRead(String)方法拒绝对此抽象路径名指定的文件进行读访问

从以下版本开始:

1.6


createTempFile

public static File createTempFile(String prefix,

String suffix,

File directory)

throws IOException

在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。如果此方法成功返回,则可以保证:

1.   由返回的抽象路径名表示的文件在此方法被调用之前不存在。

2.   此方法及其所有变体都不会在虚拟机的当前调用中再次返回相同的抽象路径名。

此方法只提供了临时文件的部分功能。要安排自动删除此方法创建的文件,可使用deleteOnExit()方法。

prefix 参数至少必须是三个字节长。建议前缀使用一个短的、有意义的字符串,比如 "hjb" 或 "mail"。suffix 参数可以为 null,在这种情况下,将使用后缀 ".tmp"。

要创建新文件,可能首先要调整前缀和后缀,使其满足底层平台的限制。如果前缀太长,则将它截断,但前三个字符将始终保留。如果后缀太长,则将它截断,但如果它以句点字符 (‘.‘) 开始,则该句点以及后跟的前三个字符将始终保留。进行了这些调整后,通过连接前缀、五个或更多个内部生成的字符以及后缀,便生成了新文件的名称。

如果 directory 参数为 null,则使用与系统有关的默认临时文件目录。默认临时文件目录由系统属性java.io.tmpdir 指定。在 UNIX 系统上,此属性的默认值通常是 "/tmp" 或 "/var/tmp";在 Microsoft Windows 系统上,该值通常是"C:\\WINNT\\TEMP"。在调用 Java 虚拟机时,可为此系统属性提供不同的值,但不保证使用程序更改此属性会对此方法使用的临时目录产生影响。

参数:

prefix - 用于生成文件名的前缀字符串;必须至少是三字符长

suffix - 用于生成文件名的后缀字符串;可以为 null,在这种情况下,将使用后缀 ".tmp"

directory - 将创建的文件所在的目录;如果使用默认临时文件目录,则该参数为 null

返回:

表示新建空文件的抽象路径名

抛出:

IllegalArgumentException - 如果 prefix 参数包含的字符少于三个

IOException - 如果无法创建文件

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法不允许创建文件

从以下版本开始:

1.2


createTempFile

public static File createTempFile(String prefix,

String suffix)

throws IOException

在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。调用此方法等同于调用createTempFile(prefix,suffix, null)

参数:

prefix - 用于生成文件名的前缀字符串;必须至少是三字符长

suffix - 用于生成文件名的后缀字符串;可以为 null,在这种情况下,将使用后缀 ".tmp"

返回:

表示新建空文件的抽象路径名

抛出:

IllegalArgumentException - 如果 prefix 参数包含的字符少于三个

IOException - 如果无法创建文件

SecurityException - 如果存在安全管理器,且其SecurityManager.checkWrite(java.lang.String)方法不允许创建文件

从以下版本开始:

1.2


compareTo

public int compareTo(File pathname)

按字母顺序比较两个抽象路径名。此方法定义的顺序取决于底层系统。在 UNIX 系统上,比较路径名时,字母大小写通常很重要,而在 MicrosoftWindows 系统上,这通常不重要。

指定者:

接口 Comparable<File> 中的 compareTo

参数:

pathname - 将与此抽象路径名进行比较的抽象路径名

返回:

如果该参数等于此抽象路径名,则返回零;如果此抽象路径名在字母顺序上小于该参数,则返回小于零的值;如果此抽象路径名在字母顺序上大于该参数,则返回大于零的值

从以下版本开始:

1.2


equals

public boolean equals(Object obj)

测试此抽象路径名与给定对象是否相等。当且仅当该参数不是 null,而是一个与此抽象路径名表示相同的文件或目录的抽象路径名时,返回 true。两个抽象路径名是否相等取决于底层系统。在 UNIX 系统上,比较路径名时,字母大小写通常很重要,而在 MicrosoftWindows 系统上,这通常不重要。

覆盖:

类 Object 中的 equals

参数:

obj - 要与此抽象路径名进行比较的对象

返回:

当且仅当对象相同时,返回true;否则返回 false

另请参见:

Object.hashCode(),Hashtable


hashCode

public int hashCode()

计算此抽象路径名的哈希码。因为抽象路径名的相等性与系统有关,所以对其哈希码的计算也与系统有关。在 UNIX系统上,抽象路径名的哈希码等于其路径名字符串和十进制值 1234321 的哈希码的异或。在 Microsoft Windows 系统上,哈希码等于其转换为小写的路径名字符串和十进制值 1234321 的哈希码的异或。在将路径名字符串转换为小写时不考虑语言环境。

覆盖:

类 Object 中的 hashCode

返回:

此抽象路径名的哈希码

另请参见:

Object.equals(java.lang.Object),Hashtable


toString

public String toString()

返回此抽象路径名的路径名字符串。该字符串就是 getPath()方法返回的字符串。

覆盖:

类 Object 中的 toString

返回:

此抽象路径名的字符串形式

1  操作文件的类--File

1.1  File类的基本介绍

在整个io包中,唯一与文件本身有关的类就是File类。使用File类可以进行创建或删除文件等常用操作。要使用File类,则首先要观察File类的构造方法,此类的常用构造方法如下:

public File(String pathname)  ‘ 实例化File类时,必须设置好路径。

可以发现,如果要使用一个File类,则必须向File类的构造方法中传递一个文件路径,例如,现在要操作D盘下的test.txt文件,则路径必须写成"d:\\test.txt",其中"\\"表示一个"\",而要操作文件,还需要使用File类中定义的若干方法,File类中的主要方法如       表12-1所示。

表12-1  File类中的主要方法和常量


序号


方法或常量


类型


描    述


1


public static final String pathSeparator


常量


表示路径的分隔符

(windows是:“;”)


2


public static final String separator


常量


表示路径的分隔符

(windows是:“\”)


3


public File(String pathname)


构造


创建File类对象,

传入完整路径


4


public boolean createNewFile() throws

IOException


普通


创建新文件


5


public boolean delete()


普通


删除文件


6


public boolean exists()


普通


判断文件是否存在


7


public boolean isDirectory()


普通


判断给定的路径是

否是一个目录


8


public long length()


普通


返回文件的大小


9


public String[] list()


普通


列出指定目录的全部内容,

只是列出了名称


10


public File[] listFiles()


普通


列出指定目录的全部内容,

会列出路径


11


public boolean mkdir()


普通


创建一个目录


12


public boolean renameTo(File dest)


普通


为已有的文件重新命名

以上操作方法是在开发中较为常见的,下面通过若干实例进行讲解。

提问:为什么File类中的常量定义的命名规则不符合标准命名规则?

在之前讲解Java命名规则时曾讲过,一个常量的全部标识符不是应该大写吗?为什么在定义pathSeparator或separator时没有定义。

回答:Java发展的历史原因造成的。

这里确实不符合Java的标准命名规则,主要原因是因为Java的发展经过了一段相当长的时间,而命名规范也是逐步形成的,File类因为出现较早,所以当时并没有对命名规范有严格的要求,这些都属于Java的历史遗留问题。

1.2  使用File类操作文件(1)

1.实例操作一:创建一个新文件

File类的对象实例化完成之后,就可以使用createNewFile创建一个新文件,但是此方法使用了throws关键字,所以在使用中,必须使用try…catch进行异常的处理。例如,现在要在D盘上创建一个test.txt的文件。

范例:创建新文件

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class FileDemo01 {
  4. public static void main(String args[]) {
  5. File f = new File("d:\\test.txt") ; // 必须给出完整路径
  6. try {
  7. f.createNewFile() ;             // 根据给定的路径创建新文件
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }

运行程序之后可以发现,在D盘中已经创建好了test.txt文件。如果在不同的操作系统中,则路径的分隔符表示是不一样的,例如:

Windows中使用反斜杆表示目录的分隔符"\"。

Linux中使用正斜杠表示目录的分隔符"/"。

那么,既然Java程序本身具有可移植性的特点,则在编写路径时最好可以根据程序所在的操作系统自动使用符合本地操作系统要求的分隔符,这样才能达到可移植性的目的。要实现这样的功能,则就需要观察File类中提供的两个常量。

范例:观察File类中提供的两个常量

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo02 {
  4. public static void main(String args[]) {
  5. System.out.println("pathSeparator:" + File.pathSeparator);
  6. // 调用静态常量
  7. System.out.println("separator:" + File.separator);// 调用静态常量
  8. }
  9. }

程序运行结果:

  1. pathSeparator:;
  2. separator:\

所以,对于之前创建文件的操作来讲,最好的做法是使用以上的常量表示路径,代码修改如下。

范例:修改创建文件的代码

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. import java.io.IOException;
  4. public class FileDemo03 {
  5. public static void main(String args[]) {
  6. String path = "d:" + File.separator + "test.txt";// 拼凑出可以适应操
  7. 作系统的路径
  8. File f = new File(path);
  9. // 必须给出路径
  10. try {
  11. f.createNewFile();
  12. // 根据给定的路径创建新文件
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }

程序的运行结果与前面的程序一样,但是此时的程序可以在任意的操作系统中使用。

U提示:在操作文件时一定要使用File.separator表示分隔符。

在程序的开发中,往往会使用Windows开发环境,因为在Windows操作系统中支持的开发工具较多,使用方便,而在程序发布时往往是直接在Linux或其他操作系统上部署,所以这时如果不使用File.separator,则程序运行就有可能存在问题,这一点读者在日后的开发中一定要有所警惕。

1.2  使用File类操作文件(2)

2.实例操作二:删除一个指定的文件

File类中也支持删除文件的操作,如果要删除一个文件,则可以使用File类中的delete()方法。

范例:删除文件

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo04 {
  4. public static void main(String args[]) {
  5. File f = new File("d:" + File.separator + "test.txt");// 必须给出路径
  6. f.delete(); // 删除文件
  7. }
  8. }

此时,文件已经删除,但是以上做法也存在问题,即在删除文件前应该保证文件存在,所以以上程序在使用时最好先判断文件是否存在,如果存在,则执行删除操作。判断一个文件是否存在可以直接使用File类提供的exists()方法,此方法返回boolean类型。

范例:在删除文件中增加判断

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo05 {
  4. public static void main(String args[]) {
  5. File f = new File("d:"+File.separator+"test.txt") ;// 必须给出路径
  6. if(f.exists()){           // 判断文件是否存在
  7. f.delete() ;          // 如果存在,则删除文件
  8. }
  9. }
  10. }

以上代码就比较合理了,保证不会删除一个不存在的文件。

3.实例操作三:综合创建和删除文件的操作

现在给定一个文件的路径,如果此文件存在,则将其删除,如果文件不存在则创建一个新的文件。执行流程如图12-1所示。

 
(点击查看大图)图12-1  程序执行流程

要想实现这样的功能,则可以把前面的3个方法联合起来使用。

范例:实现以上的功能要求

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. import java.io.IOException;
  4. public class FileDemo06 {
  5. public static void main(String args[]) {
  6. File f = new File("d:" + File.separator + "test.txt"); // 文件路径
  7. if (f.exists()) {           // 判断文件是否存在
  8. f.delete();             // 删除文件
  9. } else {
  10. try {
  11. f.createNewFile();
  12. // 创建文件
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }
  18. }

以上程序已经完成了所要求的功能,但是细心的读者可能会发现以上程序的问题,在每次程序执行完毕之后,文件并不会立刻创建或删除,会有一些延迟,这是因为所有的操作都需要通过JVM完成所造成的,如图12-2所示。所以读者在进行文件操作时,一定要考虑到延迟的影响。

 
(点击查看大图)图12-2  File操作过程

U提示:文件后缀可有可无。

在Windows中各个文件都存在后缀,例如,本例中的text.txt,后缀是.txt,表示是一个文本后缀。但是一个文件的后缀本身并没有任何的意义,即不管有没有后缀并不影响文件本身的内容。而在Windows中为了实现程序使用的便捷化管理,所以应将文件的后缀进行比较合理的应用。

12.1.2  使用File类操作文件(3)

4.实例操作四:创建一个文件夹

除了可以创建文件外,也可以使用File类指定一个文件夹,直接使用mkdir()方法就可以完成。

范例:创建文件夹

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo07 {
  4. public static void main(String args[]) {
  5. File f = new File("d:" + File.separator + "mldn"); // 给出路径
  6. f.mkdir() ;                      // 创建文件夹
  7. }
  8. }

5.实例操作五:列出指定目录的全部文件

如果现在给出了一个目录,则可以直接列出目录中的内容。在File类中定义了如下两个列出文件夹内容的方法。

public String[] list():列出全部名称,返回一个字符串数组。

public File[] listFiles():列出完整的路径,返回一个File对象数组。

范例:使用list()方法列出一个目录中的全部内容

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo08 {
  4. public static void main(String args[]) {
  5. File f = new File("d:" + File.separator);
  6. // 必须给出路径
  7. String str[] = f.list();
  8. // 列出给定目录中的内容
  9. for (int i = 0; i < str.length; i++) {
  10. System.out.println(str[i]);
  11. }
  12. }
  13. }

程序运行结果:

  1. eclipse
  2. Java
  3. Microsoft Visual Studio 8
  4. MyEclipse 5.5.1 GA
  5. MySQL
  6. oracle
  7. Sybase
  8. Tomcat 5.5
  9. WinRAR
  10. ... ... ...

从输出结果可以发现,以上列出的只是指定目录中的文件名称,并不是一个文件的完整路径,所以如果想列出每一个文件的完整路径,就必须使用另外一个列出方法--listFiles()。

范例:使用listFiles()方法列出一个目录中的全部内容

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo09 {
  4. public static void main(String args[]) {
  5. File f = new File("d:" + File.separator);
  6. // 必须给出路径
  7. File files[] = f.listFiles();
  8. // 列出全部的文件
  9. for (int i = 0; i < files.length; i++) {
  10. System.out.println(files[i]) ;
  11. }
  12. }
  13. }

程序运行结果:

  1. d:\eclipse
  2. d:\Java
  3. d:\Microsoft Visual Studio 8
  4. d:\MyEclipse 5.5.1 GA
  5. d:\MySQL
  6. d:\oracle
  7. d:\Sybase
  8. d:\Tomcat 5.5
  9. d:\WinRAR
  10. ... ... ...

以上直接打印的是File类对象,可以把一个完整的路径取出。两者比较之后可以发现,使用listFiles()方法列出目录中的内容更加方便。

12.1.2  使用File类操作文件(4)

6.实例操作六:判断一个给定的路径是否是目录

可以直接使用isDirectory()方法判断给定的一个路径是否是目录。

范例:判断给定路径是否是目录

  1. package org.lxh.demo12.filedemo;
  2. import java.io.File;
  3. public class FileDemo10 {
  4. public static void main(String args[]) {
  5. File f = new File("d:" + File.separator);
  6. // 路径
  7. if (f.isDirectory()) {
  8. // 判断是否是目录
  9. System.out.println(f.getPath() + "路径是目录。");
  10. } else {
  11. System.out.println(f.getPath() + "路径不是目录。");
  12. }
  13. }
  14. }

程序运行结果:

  1. d:\路径是目录。

以上为读者列举了一些File类中的常用方法,下面再看一个实例,以加深对File类的理解。

12.1.3  范例--列出指定目录的全部内容

给定一个目录,要求列出此目录下的全部内容,因为给定目录可能存在子文件夹,此时要求也可以把所有的子文件夹的子文件列出来。

要先判断给定的路径是否是目录,然后再使用listFiles()列出一个目录中的全部内容,一个文件夹中可能包含其他的文件或子文件夹,子文件夹中也可能会包含其他的子文件夹,所以此处只能采用递归的调用方式完成。操作的流程如图12-3所示。

 
(点击查看大图)图12-3  列出目录中的全部内容

范例:列出指定目录的全部内容

  1. package org.lxh.iodemo.filedemo;
  2. import java.io.File;
  3. public class FileDemo11 {
  4. public static void main(String args[]) {
  5. File my = new File("d:" + File.separator); // 操作路径
  6. print(my) ;
  7. }
  8. public static void print(File file) {    // 递归调用此方法
  9. if (file != null) {                // 增加一个检查机制
  10. if (file.isDirectory()) {          // 判断是否是目录
  11. File f[] = file.listFiles() ;  // 如果是目录,则列出全部的
  12. 内容
  13. if (f != null) {               // 有可能无法列出目录中的
  14. 文件
  15. for (int i = 0; i < f.length; i++) {
  16. print(f[i]);          // 继续列出内容
  17. }
  18. }
  19. }else{
  20. System.out.println(file);     // 如果不是目录,则直接打印
  21. 路径信息
  22. }
  23. }
  24. }
  25. }

以上程序采用递归的调用形式不断地判断传进来的路径是否是目录,如果是目录,则继续列出子文件夹,如果不是,则直接打印路径名称。

构造函数

复制代码 代码如下:

public class FileDemo {

public static void main(String[] args){

//构造函数File(String pathname)

File f1 =new File("c:\\abc\\1.txt");

//File(String parent,String child)

File f2 =new File("c:\\abc","2.txt");

//File(File parent,String child)

File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符

File f4 =new File(f3,"3.txt");

System.out.println(f1);//c:\abc\1.txt

}

}

创建方法

1.boolean createNewFile() 不存在返回true 存在返回false

2.boolean mkdir() 创建目录

3.boolean mkdirs() 创建多级目录

删除方法

1.boolean delete()

2.boolean deleteOnExit() 文件使用完成后删除

复制代码 代码如下:

import java.io.File;

import java.io.IOException;

public class FileDemo2 {

public static void main(String[] args){

File f =new File("d:\\1.txt");

try {

System.out.println(f.createNewFile());//当文件存在时返回false

System.out.println(f.delete());//当文件不存在时返回false

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

判断方法

1.boolean canExecute()判断文件是否可执行

2.boolean canRead()判断文件是否可读

3.boolean canWrite() 判断文件是否可写

4.boolean exists() 判断文件是否存在

5.boolean isDirectory()

6.boolean isFile()

7.boolean isHidden()

8.boolean isAbsolute()判断是否是绝对路径 文件不存在也能判断

获取方法

1.String getName()

2.String getPath()

3.String getAbsolutePath()

4.String getParent()//如果没有父目录返回null

5.long lastModified()//获取最后一次修改的时间

6.long length()

7.boolean renameTo(File f)

8.File[] liseRoots()//获取机器盘符

9.String[] list()

10.String[] list(FilenameFilter filter)

列出磁盘下的文件和文件夹

复制代码 代码如下:

public class FileDemo3 {

public static void main(String[] args){

File[] files =File.listRoots();

for(File file:files){

System.out.println(file);

if(file.length()>0){

String[] filenames =file.list();

for(String filename:filenames){

System.out.println(filename);

}

}

}

}

}

文件过滤

复制代码 代码如下:

import java.io.File;

import java.io.FilenameFilter;

public class FileDemo4 {

public static void main(String[] args){

File[] files =File.listRoots();

for(File file:files){

System.out.println(file);

if(file.length()>0){

String[] filenames =file.list(new FilenameFilter(){

//file 过滤目录 name 文件名

public boolean accept(File file,String filename){

return filename.endsWith(".mp3");

}

});

for(String filename:filenames){

System.out.println(filename);

}

}

}

}

}

File[]  listFiles()

File[] listFiles(FilenameFilter filter)

利用递归列出全部文件

复制代码 代码如下:

public class FileDemo5 {

public static void main(String[] args){

File f =new File("e:\\音樂");

showDir(f);

}

public static void showDir(File dir){

System.out.println(dir);

File[] files =dir.listFiles();

for(File file:files){

if(file.isDirectory())

showDir(file);

else

System.out.println(file);

}

}

}

移动文件

找出d盘下所有的 .java 文件,拷贝至 c:\jad 目录下,并将所有文件的类型由.java 修改为.jad 。

复制代码 代码如下:

public class Test5 {

public static void main(String[] args){

File f1 = new File("d:\\");

moveFile(f1);

}

public static void moveFile(File dir){

File[] files=dir.listFiles();

for(File file:files){

if(file.isDirectory())

moveFile(file);

else{

if(file.getName().endsWith(".java"))

file.renameTo(new File("c:\\jad\\"+

file.getName().substring(0,file.getName().lastIndexOf(‘.‘))+".jad"));

}

}

}

}

时间: 2024-08-04 10:28:58

javaIO—File类详解的相关文章

JavaIO(01)File类详解

File类 file类中的主要方法和变量 常量: 表示路径的分割符:(windows) 作用:根据java可移植性的特点,编写路径一定要符合本地操作系统要求的分割符: public static final String separator public static final String pathSeparator package cn.itcast; import java.io.File; public class DemoFile02 { public static void mai

File类详解

一.File类: File类时io包中唯一代表磁盘文件本身的对象.File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.删除.重命名文件等. File类的对象主要用来获取文本的一些信息,如文件所在的目录.文件的长度.文件的读取权限等. 1.文件的创建:目录(文件夹)的创建 File(String pathname):在此File的构造方法中填入一个String类型的路径名:实例如下: String s="d:\\aaa.txt"; File f=ne

08、File类详解

一.File类 1.1.File解析 File类可以用来将文件或文件夹封装成对象同时也可以作为参数传递给流的构造函数,方便对文件的读写操作. (1)File f1 = new File("a.txt");//将a.txt封装成file对象.可以将已有的和未出现的文件或者文件夹封装成对象. (2)File f2 = new File("c:\\abc","b.txt");//将目录和文件分成两个参数进行传递. (3)File d = new Fil

【56】java本地文件File类详解

1.java类的介绍 public class File extends Object implements Serializable, Comparable<File> 文件和目录路径名的抽象表示形式. File既可以表示文件也可以表示目录. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图. 2.构造方法 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符

java中File类详解

构造函数 代码如下: public class FileDemo {     public static void main(String[] args){         //构造函数File(String pathname)         File f1 =new File("c:\\abc\\1.txt");         //File(String parent,String child)         File f2 =new File("c:\\abc&qu

QAction类详解:

先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action that can be inserted into widgets. In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user

URLConnection类详解

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html URLConnection概述 URLConnection是一个抽象类,表示指向URL指定资源的活动连接. URLConnection类本身依赖于Socket类实现网络连接.一般认为,URLConnection类提供了比Socket类更易于使用.更高级的网络连接抽象.但实际上,大多数程序员都会忽略它

JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表

一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public class HelloAction { public String hello(){ System.out.println("hello world!"); return "success"; } } 3.书写src/struts.xml (记得加上dtd约束) &l

JDK中Unsafe类详解

Java中Unsafe类详解 在openjdk8下看Unsafe源码 http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/classes/sun/misc/Unsafe.java http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Unsafe.java Java并发编程之LockSuppor