File类
1.1java.io.File类
1.1.1概述
File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建、删除、重命名文件和目录。
在API中File的解释是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身,因此File类不能直接访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
File类代表磁盘或网络中某个文件或目录的路径名称,如:d:/atguigu/javase/io
但不能直接通过File对象读取和写入数据,如果要操作数据,需要IO流。File对象好比是到水库的“路线地址”,要“存取”里面的水到你“家里”,需要“管道”。
1.1.2构造方法
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。- 构造举例,代码如下:
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通过父路径和子路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
小贴士:
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
1.1.3 常用方法
1、获取文件和目录基本信息的方法
-
public String getName()
:返回由此File表示的文件或目录的名称。 -
public long length()
:返回由此File表示的文件的长度。 -
public String getPath()
:将此File转换为路径名字符串。 -
public long lastModified()
:返回File对象对应的文件或目录的最后修改时间(毫秒值)方法演示,代码如下:
import java.io.File; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; public class TestFile { public static void main(String[] args) { File f = new File("d:/aaa/bbb.txt"); System.out.println("文件构造路径:"+f.getPath()); System.out.println("文件名称:"+f.getName()); System.out.println("文件长度:"+f.length()+"字节"); System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai"))); File f2 = new File("d:/aaa"); System.out.println("目录构造路径:"+f2.getPath()); System.out.println("目录名称:"+f2.getName()); System.out.println("目录长度:"+f2.length()+"字节"); System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai"))); } } 输出结果: 文件构造路径:d:\aaa\bbb.java 文件名称:bbb.java 文件长度:636字节 文件最后修改时间:2019-07-23T22:01:32.065 目录构造路径:d:\aaa 目录名称:aaa 目录长度:4096字节 文件最后修改时间:2019-07-23T22:01:32.065
API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。
2、各种路径问题
public String getPath()
:将此File转换为路径名字符串。public String getAbsolutePath()
:返回此File的绝对路径名字符串。String getCanonicalPath()
:返回此File对象所对应的规范路径名。
File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。
默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性“user.dir”指定,通常也就是运行Java虚拟机时所作的路径。
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
- 规范路径:所谓规范路径名,即对路径中的“…”等进行解析后的路径名
@Test
public void test1() throws IOException{
File f1 = new File("d:\\atguigu\\javase\\HelloIO.java");
System.out.println("文件/目录的名称:" + f1.getName());
System.out.println("文件/目录的构造路径名:" + f1.getPath());
System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
System.out.println("文件/目录的规范路径名:" + f1.getCanonicalPath());
System.out.println("文件/目录的父目录名:" + f1.getParent());
}
@Test
public void test2() throws IOException{
File f2 = new File("HelloIO.java");
System.out.println("user.dir =" + System.getProperty("user.dir"));
System.out.println("文件/目录的名称:" + f2.getName());
System.out.println("文件/目录的构造路径名:" + f2.getPath());
System.out.println("文件/目录的绝对路径名:" + f2.getAbsolutePath());
System.out.println("文件/目录的规范路径名:" + f2.getCanonicalPath());
System.out.println("文件/目录的父目录名:" + f2.getParent());
}
@Test
public void test3() throws IOException{
File f3 = new File("../../HelloIO.java");
System.out.println("user.dir =" + System.getProperty("user.dir"));
System.out.println("文件/目录的名称:" + f3.getName());
System.out.println("文件/目录的构造路径名:" + f3.getPath());
System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
System.out.println("文件/目录的规范路径名:" + f3.getCanonicalPath());
System.out.println("文件/目录的父目录名:" + f3.getParent());
}
- window的路径分隔符使用“\”,而Java程序中的“\”表示转义字符,所以在Windows中表示路径,需要用“\”。或者直接使用“/”也可以,Java程序支持将“/”当成平台无关的路径分隔符。或者直接使用File.separator常量值表示。
- 把构造File对象指定的文件或目录的路径名,称为构造路径,它可以是绝对路径,也可以是相对路径
- 当构造路径是绝对路径时,那么getPath和getAbsolutePath结果一样
- 当构造路径是相对路径时,那么getAbsolutePath的路径 = user.dir的路径 + 构造路径
- 当路径中不包含"…“和”/开头"等形式的路径,那么规范路径和绝对路径一样,否则会将…等进行解析。路径中如果出现“…”表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。
3、判断功能的方法
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。public isAbsolute()
:判断File对象对应的文件或目录是否是绝对路径public boolean canRead()
:判断File对象对应的文件或目录是否可读public boolean canWrite()
:判断File对象对应的文件或目录是否可写public boolean isHidden()
:判断File对象对应的文件或目录是否是否隐藏
方法演示,代码如下:
public class FileIs {
public static void main(String[] args) {
File f = new File("d:\\aaa\\bbb.java");
File f2 = new File("d:\\aaa");
// 判断是否存在
System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
System.out.println("d:\\aaa 是否存在:"+f2.exists());
// 判断是文件还是目录
System.out.println("d:\\aaa 文件?:"+f2.isFile());
System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
}
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true
如果文件或目录不存在,那么exists()、isFile()和isDirectory()都是返回true
4、创建删除功能的方法
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。public boolean delete()
:删除由此File表示的文件或目录。 只能删除空目录。public boolean mkdir()
:创建由此File表示的目录。public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
方法演示,代码如下:
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
// 文件的创建
File f = new File("aaa.txt");
System.out.println("是否存在:"+f.exists()); // false
System.out.println("是否创建:"+f.createNewFile()); // true
System.out.println("是否存在:"+f.exists()); // true
// 目录的创建
File f2= new File("newDir");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir()); // true
System.out.println("是否存在:"+f2.exists());// true
// 创建多级目录
File f3= new File("newDira\\newDirb");
System.out.println(f3.mkdir());// false
File f4= new File("newDira\\newDirb");
System.out.println(f4.mkdirs());// true
// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。
5、创建和删除临时文件
public void deleteOnExit()
:当退出JVM时,删除文件,一般用于删除临时文件,一旦请求,无法取消。- public static File createTempFile(String prefix,String suffix) throws IOException在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。调用此方法等同于调用 createTempFile(prefix, suffix, null)。
- prefix - 用于生成文件名的前缀字符串;必须至少三个字符。
- suffix - 用于生成文件名的后缀字符串;如果为 null,默认为 “.tmp”
- public static File createTempFile(String prefix,String suffix,File directory)throws IOException在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
- prefix - 用于生成文件名的前缀字符串;必须至少三个字符。
- suffix - 用于生成文件名的后缀字符串;如果为 null,默认为 “.tmp”
- directory - 将创建的文件所在的目录;如果使用默认临时文件目录,则该参数为 null
import java.io.File;
import java.io.IOException;
import org.junit.Test;
public class TestFile {
@Test
public void test6() throws IOException{
File tempFile = File.createTempFile("Hello", ".tmp");
System.out.println(tempFile.getAbsolutePath());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tempFile.deleteOnExit();
//C:\Users\Irene\AppData\Local\Temp\Hello2541030191749214481.tmp
}
}
创建临时文件,通常会结合deleteOnExit()使用
6、重命名功能的方法
public boolean renameTo(File dest)
:重命名文件或目录
此方法行为的许多方面都是与平台有关的:
如果是重命名文件,那么重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。
如果是重命名目录,那么如果是windows目录,只能在同一个盘下,不能从D盘移动到E盘。
@Test
public void test9(){
File src = new File("d:/javase/HelloIO.java");
File dest = new File("d:/javase/HelloFile.java");
src.renameTo(dest);
}
@Test
public void test10() {
File src = new File("d:/javase/HelloIO.java");
File dest = new File("e:/HelloFile.java");
//D盘和E盘相同的文件系统可以成功,例如都是NTFS。
src.renameTo(dest);
}
@Test
public void test7() {
File dir = new File("D:/javase");
File dest = new File("D:/java代码");
dir.renameTo(dest);
}
@Test
public void test8() {
File dir = new File("D:/javase");
File dest = new File("D:/temp");
dir.renameTo(dest);
}