目录
Java File类概念
在Java中,File类时java.io包中唯一代表磁盘文件本身的对象,在程序中操作文件和目录,都可以通过File类来完成。File类定义了一些方法来操作文件(新建、删除、重命名和目录等)
File类不能访问文件内容本身,如果需要访问文件内容本身,需要使用输入/输出流。
File方法
构造方法
-
File(String path): 如果path时实际存在的路径,则该File对象表示的是目录;如果path是文件名,则该File对象表示的是文件。
-
File(String path, String name): path是路径名,name是文件名。
-
File(File dir, String name): dir是路径对象, name是文件名。
使用任意一个构造方法都可以创建一个File对象,然后调用其提供的方法对文件进行操作。
常用方法
方法名称 | 说明 |
---|---|
boolean canRead() | 测试应用程序是否能从指定的文件中进行读取 |
boolean canWrite() | 测试应用程序是否能写当前文件 |
boolean delete() | 删除当前对象指定的文件 |
boolean exists() | 测试当前File是否存在 |
String getAbsolutePath() | 返回由该对象表示的文件的绝对路径名 |
String getName() | 返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名) |
String getParent() | 返回当前File对象所对应目录(最后一级子目录)的父类目录 |
boolean isAbsolute() | 测试当前File对象表示的文件是否为一个绝对路径名 |
boolean isDirectory() | 测试当前File对象表示的文件是否为一个路径 |
boolean isFile() | 测试当前File对象表示的文件是否为一个"普通"文件 |
long lastModified() | 返回当前File对象表示的文件最后修改的时间 |
long length() | 返回当前File对象表示的文件长度 |
String[] list() | 返回当前File对象指定的路径文件列表 |
String[] list(FilenameFilter) | 返回当前File对象指定的目录中满足指定过滤器的文件列表 |
boolean mkdir() | 创建一个目录,它的路径名由当前File对象指定 |
boolean mkdirs() | 创建一个目录,它的路径名由当前File对象指定,包括创建必需但不存在的父目录 |
boolean renameTo(File) | 将当前File对象指定的文件更名为给定参数File指定的路径名 |
File类中有以下两个常用常量:
-
public static final String pathSeparator: 指的是分隔连续多个路径字符串的分隔符,Windows下指 ";" 例如: java -cp test.jar; abc.jar HelloWorld
-
public static final String separator: 用来分隔同一个路径字符串中的目录,Windows下指"/" 例如: D:/Common Files
注意: 可以看到File类的常量定义的命名规则不符合标准命名规则,常量名没有全部大写,这是因为Java的发展经过了一段相当长的时间,而命名规范也是逐步形成的,File类出现较早,所以当时并没有队命名规范有严格的要求,这些都属于Java的历史遗留问题
Windows的路径分隔符使用反斜线"\\",而Java程序中的反斜线表示转义字符,所有如果需要在Windows的路径下包括反斜线,则应该用两条反斜线或直接使用斜线"/"也可以。Java程序支持将斜线当成平台无关的路径分隔符。
假设在Windows操作系统中有一文件D:\javaSE\hello.java,
在Java中使用的时候,其路径的写法应该为D:/javaSE/hello.java
或者D:\\javaSE\\hello.java
代码示范
获取文件属性
//文件 D:\test.txt
//编写Java程序获取并显示该文件的长度、是否可写、最后修改日期以及文件路径等属性信息
public static void main(String[] args) {
String path = "D:\\";
File f = new File(path, "test.txt");
System.out.println("D:\\test.txt文件信息如下:");
System.out.println("=====================");
System.out.println("文件长度:"+f.length()+"字节");
System.out.println("文件或者目录: "+ (f.isFile()? "是文件": "不是文件"));
System.out.println("文件或者目录: "+ (f.isDirectory()? "是目录": "不是目录"));
System.out.println("是否可读: "+(f.canRead()? "可读取": "不可读取"));
System.out.println("是否可写: "+(f.canWrite()? "可写入": "不可写入"));
System.out.println("是否隐藏: "+(f.isHidden()? "是隐藏文件": "不是隐藏文件") );
System.out.println("最后修改日期: "+ new Date(f.lastModified()));
System.out.println("文件名称: "+f.getName());
System.out.println("文件路径: "+f.getPath());
System.out.println("绝对路径: "+f.getAbsolutePath());
}
//输出为:
D:\test.txt文件信息如下:
=====================
文件长度:47字节
文件或者目录: 是文件
文件或者目录: 不是目录
是否可读: 可读取
是否可写: 可写入
是否隐藏: 不是隐藏文件
最后修改日期: Thu Nov 18 19:53:02 CST 2021
文件名称: test.txt
文件路径: D:\test.txt
绝对路径: D:\test.txt
创建和删除文件①
File类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用createNewFile()方法,删除文件需要调用delete()方法。无论是创建还是删除文件通常都先调用exists()方法判断文件是否存在。
public static void main(String[] args) throws IOException {
File f = new File("D:\\test.txt");
if(f.exists()) {
f.delete();
}
f.createNewFile();
}
//运行之后可以发现,在D盘中创建好了test.txt文件
Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当使用绝对路径时,跨平台会出现"No such file or diretory"的异常
比如说要建立一个test.txt文件,在Windows下应该这么写:
File file1 = new File ("D:\\test.txt");
在Linux下则是这样的:
File file2 = new File ("/test.txt");
考虑跨平台,最好的写法:
File myFile = new File("D:" + File.separator, "test.txt");
File类有几个类似separator 的静态字段,都是与系统相关的,在编程时应尽量使用。
separatorChar
与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。
UNIX 系统上,此字段的值为 ‘/’
Microsoft Windows 系统上,它为 ‘\’
separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
pathSeparatorChar
与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。
此字符用于分隔以路径列表 形式给定的文件序列中的文件名。
UNIX 系统上,此字段为 ‘:’;
Microsoft Windows 系统上,它为 ‘;’。
pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 pathSeparatorChar。
修改代码如下:
public static void main(String[] args) throws IOException {
String path = "D:" + File.separator + "test.txt";
// 拼凑出可以适应操作系统的路径
File f = new File(path);
if (f.exists()){// 判断文件是否存在
f.delete(); // 存在则先删除
}
f.createNewFile(); // 再创建
}
注意:在操作文件时一定要使用File.separator表示分隔符。在程序的开发中,往往会使用Windows开发环境,因为在Windows操作系统中支持的开发工具较多,使用方便,而在程序发布时往往是直接在Linux或其它操作系统上部署,所以这时如果不使用File.separator,则程序运行就有可能存在问题。
创建和删除文件②
File类除了对文件的创建和删除外,还可以创建和删除目录。创建目录需要调用mkdir()方法,删除目录需要调用delete()方法。无论是创建还是删除目录都可以调用 exists() 方法判断目录是否存在。
public static void main(String[] args) {
String path = "D:/Illusion/"; // 指定目录位置
File f = new File(path); // 创建File对象
if (f.exists()) {
f.delete();
}
f.mkdir(); // 创建目录
}
遍历目录
通过遍历目录可以在指定的目录中查找文件,或者显示所有的文件列表。File()类的list()方法提供了遍历目录功能。
1.String[] list()
该方法表示返回由File对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的File对象不是目录,返回null
2.String[] list(FilenameFilter filter)
该方法的作用与list()方法相同,不同的是返回数组中仅包含符合filter过滤器的文件和目录,如果filter为null,则接受所有名称
public static void main(String[] args) {
File f = new File("D:/");
System.out.println("文件名\t\t文件类型\t\t文件大小:");
System.out.println("=========================================");
String fileList[] = f.list();
for(int i = 0;i < fileList.length; i++) {
System.out.print(fileList[i] + "\t\t");
System.out.print((new File("D:/",fileList[i])).isFile()?
"文件"+"\t\t":"文件夹"+"\t\t");
System.out.println((new File("D:/",fileList[i])).length()+"字节");
}
}
/*文件名 文件类型 文件大小:
=========================================
$RECYCLE.BIN 文件夹 4096字节
beixin_vm 文件夹 0字节
CloudMusic 文件夹 0字节
Config.Msi 文件夹 0字节
CubeLibrary 文件夹 0字节
Drivers 文件夹 0字节
get-pip.py 文件 1869136字节
Illusion 文件夹 0字节
JAVA study 文件夹 0字节
LenovoSoftstore 文件夹 0字节
*/
由于list()方法返回的字符数组仅包含文件名称,因此为了获取文件类型和大小,必须转换为File对象在调用其方法