Java中的File类(非常详细)
在 Java 应用程序中经常会使用文件保存数据或作为数据源为程序提供数据。在进行文件操作时,需要知道关于文件的一些信息,通过 File 类可以获取文件本身的一些属性信息,例如文件名称、所在路径、可读性、可写性、文件的长度等。
通过以上三个构造方法可以创建一个 File 对象,示例代码如下:
使用 File 类进行操作,首先要设置文件的路径。Windows 系统的路径如“E:\教材编写\Java2023”,分隔符为“\”。但是在 Java 中“\”表示转义,在 Windows 系统的 Java 代码中,“\”可以表示路径,因此,在 Windows 系统使用“\”作为路径分隔符,就要使用两个“\”,如“E:\\教材编写\\Java2023”。
Windows 系统也支持将“/”作为分隔符,所以在 Windows 系统中,路径有以下两种表示方法:
File 类的常见方法如下所示。
一个 File 对象表示的文件并不是真正的文件,只是一个代理而已,通过这个代理可以操作文件。
创建一个文件对象和创建一个文件在 Java 中是两个不同的概念。前者是在虚拟机中创建一个文件,但却没有将它真正地创建到 OS 的文件系统,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地创建文件。
例如如下代码:
【实例】 File 类查看文件目录和文件属性。根据命令行输入的参数,如果是目录,则显示目录下的所有文件与目录名称;如果是文件,则显示文件的属性。
Java File类的构造方法
File 类的构造方法主要有以下几种:- File(String pathname):pathname 可以是某个目录,也可以是包含路径的文件名。
- File(String directoryPath,String filename):directoryPath 表示目录,filename 表示子目录或文件名。
- File(File f, String filename):f 表示目录对象,filename 表示子目录或文件名。
通过以上三个构造方法可以创建一个 File 对象,示例代码如下:
File f1 = new File("/"); File f2 = new File("/","text.txt"); File f3 = new File(f1,"text.txt");上面代码创建了三个 File 对象 f1、f2 和 f3,在指定路径时,使用了“/”作为分隔符,也可以使用“\\”。
使用 File 类进行操作,首先要设置文件的路径。Windows 系统的路径如“E:\教材编写\Java2023”,分隔符为“\”。但是在 Java 中“\”表示转义,在 Windows 系统的 Java 代码中,“\”可以表示路径,因此,在 Windows 系统使用“\”作为路径分隔符,就要使用两个“\”,如“E:\\教材编写\\Java2023”。
Windows 系统也支持将“/”作为分隔符,所以在 Windows 系统中,路径有以下两种表示方法:
- 使用“\\”:“E:\\教材编写\\Java2023”。
- 使用“/”:“E:/教材编写/Java2023”。
Java File类的常用方法
如果创建一个文件对象,就可以使用 File 类的相关方法来获得文件的相关信息,对文件进行操作。File 类的常见方法如下所示。
1) 文件名的操作
方法 | 描述 |
---|---|
public String getName() | 获取文件的名字。 |
public String toString() | 返回文件的路径名字符串。 |
public String getParent() | 获取文件父路径字符串。 |
public File getPath() | 获取文件的相对路径字符串。 |
public String getAbsolutePath() | 获取文件的绝对路径字符串。 |
public String getCanonicalPath() throws IOException | 返回规范的路径名字符串。 |
public File getCanonicalFile() throws IOException | 返回文件(含相对路径名)规范形式。 |
public File getAbsoluteFile() | 返回此抽象路径名的绝对形式。 |
public boolean renameTo(File dest) | 重命名由此抽象路径名表示的文件。 |
public static File createTempFile(String prefix, String suffix, File directory) throws IOException | 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
public static File createTempFile(String prefix, String suffix) throws IOException | 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。 |
public boolean createNewFile() throws IOException | 当指定文件不存在时,建立一个空文件。 |
2) 文件属性测试
方法 | 描述 |
---|---|
public boolean canRead() | 测试应用程序是否能读指定的文件。 |
public boolean canWrite() | 测试应用程序是否能修改指定的文件。 |
public boolean exists() | 测试指定的文件是否存在。 |
public boolean isDirectory() | 测试指定文件是否为目录。 |
public boolean isAbsolute() | 测试路径名是否为绝对路径。 |
public boolean isFile() | 测试指定的文件是否为一般文件。 |
public boolean isHidden() | 测试指定的文件是否为隐藏文件。 |
3) 一般文件信息和工具
方法 | 描述 |
---|---|
public long lastModified() | 返回指定的文件最后被修改的时间。 |
public long length() | 返回指定文件的字节长度。 |
public boolean delete() | 删除指定的文件。 |
public void deleteOnExit() | 当虚拟机执行结束时,请求删除指定的文件或目录。 |
4) 目录操作
方法 | 描述 |
---|---|
public boolean mkdir() | 创建指定的目录,正常建立时返回true,否则返回false。 |
public boolean mkdirs() | 创建指定的目录,包含任何不存在的父目录。 |
public String[] list() | 返回指定目录下的文件(存入数组)。 |
public String[] list(FilenameFilter filter) | 返回指定目录下满足指定文件过滤器的文件。 |
public File[] listFiles() | 返回指定目录下的文件。 |
public File[] listFiles(FilenameFilter filter) | 返回指定目录下满足指定文件过滤器的文件。 |
public File[] listFiles(FileFilter filter) | 返回指定目录下满足指定文件过滤器的文件(返回路径名应满足文件过滤器)。 |
public static File[] listRoots() | 列出可用文件系统的根目录结构。 |
5) 文件属性设置
- public boolean setLastModified(long time):设置指定文件或目录的最后修改时间,操作成功返回 true,否则返回 false。
- public boolean setReadOnly():标记指定的文件或目录为只读属性,操作成功返回 true,否则返回 false。
6) 其他
- public URL toURL() throws MalformedURLException:把相对路径名存入 URL 文件;
- public int compareTo(Object o):比较两个抽象的路径名字典;
- public boolean equals(Object obj):测试此抽象路径名与给定对象的相等性;
- public int hashCode():返回文件名的哈希值。
一个 File 对象表示的文件并不是真正的文件,只是一个代理而已,通过这个代理可以操作文件。
创建一个文件对象和创建一个文件在 Java 中是两个不同的概念。前者是在虚拟机中创建一个文件,但却没有将它真正地创建到 OS 的文件系统,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地创建文件。
例如如下代码:
File f = new File("11.txt"); // 创建一个名为 11.txt 的文件对象 f.createNewFile(); // 真正地创建文件
【实例】 File 类查看文件目录和文件属性。根据命令行输入的参数,如果是目录,则显示目录下的所有文件与目录名称;如果是文件,则显示文件的属性。
import java.io.*; import java.util.*; public class FileDemo { public static void main(String[] args) { try { File file = new File(args[0]); if (file.isFile()) { // 是否为文件 System.out.println(args[0] + " 文件 "); if (file.canRead()) System.out.println("可读 "); else System.out.println("不可读 "); if (file.canWrite()) System.out.println("可写 "); else System.out.println("不可写 "); System.out.println(file.length() + " 字节 "); } else { File[] files = file.listFiles(); // 列出所有的文件及目录 ArrayList<File> fileList = new ArrayList<File>(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { // 是否为目录 System.out.println("[" + files[i].getPath() + "]"); } else { fileList.add(files[i]); // 文件先存入 fileList } } for (File f : fileList) { System.out.println(f.toString()); // 列出文件 } System.out.println(); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("using: Java FileDemo pathname"); } } }程序执行结果为:
d:\\user.txt 文件
可读
可写
27字节