一、File 类概述
1、java.io.File类: 文件和文件目录路径的抽象表示形式,主要用于文件和目录的创建、查找和删除等操作。
2、File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。
3、File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
4、File 是文件和目录路径名的抽象表示形式,即File类的对象代表一个文件或一个目录(文件夹)的路径,而不是文件本身。
5、想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
6、File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
路径问题:
绝对路径:从盘符开始的路径,这是一个完整的路径。如:E:\\a.txt
相对路径:相当于项目目录的路径,这个一个便捷的路径。如:../a.txt
注意:
1. 路径不区分大小写
2. 路径中的文件名称分隔符 window 使用反斜杠(\)也支持斜杠(/),反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
3. 其他的平台都使用斜杠作为分隔符(/),网络地址也是(http://www.baidu.com)。
4. window 的路径分隔符使用“\”,而Java程序中的“\”表示转义字符,所以在Windows中表示路径,需要用“\\”。或者直接使用“/”也可以,Java程序支持将“/”当成平台无关的路径分隔符。或者直接使用File.separator常量值表示。
5. 路径中如果出现 “..” 表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。
二、File 类结构
1、File 类继承结构
2、File 类声明
public class File
implements Serializable, Comparable<File>{...}
3、File 类方法列表
三、File 构造器
File 类提供了六个构造器,下面为常用的几种构造器。
1、方式一
public File(String pathname)
① 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
② 以pathname为路径创建File对象,可以是绝对路径或者相对路径。
③ 如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
(1)绝对路径:是从一个固定的路径,从盘符开始;
(2)相对路径:是相对于某个位置开始;
④ 路径可以是存在,也可以是不存在,创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
2、方式二
public File(String parent,String child)
以 parent 为父路径,child 为子路径创建 File 对象。
优点:父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化
3、方式三
public File(File parent,String child)
根据一个父 File 对象和子文件路径创建 File 对象。
从父抽象路径名和子路径名字符串创建新的 File实例。
注意:
① 一个 File 对象代表硬盘实际存在一个文件或者目录。
② 无论该路径下是否存在文件或者目录,都不影响 File 对象的创建。
优点:
① 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化
② 父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象
4、方式四
public File(URI uri):通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
5、案例
1 @Test
2 public void test1() {
3 //构造器1
4 File file1 = new File("hello.txt");//相对于当前module
5 File file2 = new File("D:\\Java—Workspaceing\\JavaSenior\\Java");
6
7 System.out.println(file1);
8 System.out.println(file2);
9
10 //构造器2:
11 File file3 = new File("D:\\Java—Workspaceing","JavaSenior");
12 System.out.println(file3);
13
14 //构造器3:
15 File file4 = new File(file3,"hi.txt");
16 System.out.println(file4);
17 }
18 }
运行结果:
默认调用 File 类的 toString() 方法,
在这里并不关心文件是否真正的存在,只是把文件的 path(路径)打印出来。
四、File 类:路径分隔符
1、上面的案例中,路径中的每级目录之间用一个 路径分隔符 隔开。
2、路径分隔符和系统有关:
(1)Windows 和 DOS 系统默认使用 "\" 来表示;
(2)UNIX 和 URL 使用 "/" 来表示;
3、Java 程序支持跨平台运行,因此路径分隔符要慎用。
4、为了解决这个隐患,File 类提供了一个常量:
public static final String separator = "" + separatorChar;
public static final char separatorChar = fs.getSeparator();
能根据操作系统,动态的提示分隔符。
例如:
1 @Test
2 public void test2() {
3 File file1 = new File("D:\\Java—Workspaceing\\JavaSenior\\Java");
4 File file2 = new File("D:" + File.separator + "Java—Workspaceing" + File.separator + "JavaSenior" + File.separator + "Java");
5 System.out.println("file1 = " + file1);
6 System.out.println("file2 = " + file2);
7 }
运行结果:
五、File 类常用方法
1、File 类的获取功能
public String getAbsolutePath(): 获取绝对路径
public String getPath() : 获取路径
public String getName() : 获取名称
public String getParent(): 获取上层文件目录路径。 若无, 返回null
public long length() : 获取文件长度(即:字节数) 。 不能获取目录的长度。
public long lastModified() : 获取最后一次的修改时间, 毫秒值
public String[] list() : 获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() : 获取指定目录下的所有文件或者文件目录的File数组
Demo:
1 @Test
2 public void test2(){
3 File file1 = new File("hello.txt");
4
5 System.out.println(file1.getAbsolutePath());
6 System.out.println(file1.getPath());
7 System.out.println(file1.getName());
8 System.out.println(file1.getParent());
9 System.out.println(file1.length());
10 System.out.println(new Date(file1.lastModified())); //返回毫秒数
11
12 System.out.println();
13
14 File file2 = new File("D:\\Java—Workspaceing\\hi.txt");
15
16 System.out.println(file2.getAbsolutePath());
17 System.out.println(file2.getPath());
18 System.out.println(file2.getName());
19 System.out.println(file2.getParent());
20 System.out.println(file2.length());
21 System.out.println(file2.lastModified());
22 }
运行结果:
Demo2:
1 @Test
2 public void test3(){
3 File file = new File("D:\\Java—Workspaceing");
4
5 String[] list = file.list();
6 for(String s : list){
7 System.out.println(s);
8 }
9
10 System.out.println();
11
12 File[] files = file.listFiles();
13 for(File f : files){
14 System.out.println(f);
15 }
16
17 }
2、File 类的重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
Demo:
1 @Test
2 public void test4(){
3 File file1 = new File("hello.txt");
4 File file2 = new File("D:\\IO\\hi.txt");
5
6 boolean renameTo = file1.renameTo(file2);
7 System.out.println(renameTo);
8
9 }
注意:要想保证返回 true,即修改成功,需要 file1 在硬盘中是存在的,且 file2 不能在硬盘中存在。
3、File 类的判断功能
public boolean isDirectory():判断是否是文件目录
public boolean isFile() :判断是否是文件
public boolean exists() :判断是否存在
public boolean canRead() :判断是否可读
public boolean canWrite() :判断是否可写
public boolean isHidden() :判断是否隐藏
Demo:
1 @Test
2 public void test5(){
3 File file1 = new File("hello.txt");
4 //file1 = new File("hello1.txt");
5
6 System.out.println(file1.isDirectory());
7 System.out.println(file1.isFile());
8 System.out.println(file1.exists());
9 System.out.println(file1.canRead());
10 System.out.println(file1.canWrite());
11 System.out.println(file1.isHidden());
12
13 System.out.println();
14
15 File file2 = new File("D:\\Java—Workspaceing\\IO");
16 //file2 = new File("D:\\Java—Workspaceing\\IO1");
17 System.out.println(file2.isDirectory());
18 System.out.println(file2.isFile());
19 System.out.println(file2.exists());
20 System.out.println(file2.canRead());
21 System.out.println(file2.canWrite());
22 System.out.println(file2.isHidden());
23
24 }
4、File 类的创建功能
public boolean createNewFile() : 创建文件。 若文件存在, 则不创建, 返回false
public boolean mkdir() : 创建文件目录。 如果此文件目录存在, 就不创建了。如果此文件目录的上层目录不存在, 也不创建。
public boolean mkdirs() : 创建文件目录。 如果上层文件目录不存在, 一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
Demo1:
1 @Test
2 public void test6() throws IOException {
3 File file1 = new File("hi.txt");
4 if(!file1.exists()){
5 //文件的创建
6 file1.createNewFile();
7 System.out.println("创建成功");
8 }else{//文件存在
9 file1.delete();
10 System.out.println("删除成功");
11 }
12 }
Demo2:
1 @Test
2 public void test7(){
3 //文件目录的创建
4 File file1 = new File("D:\\IO\\IO1\\IO3");
5
6 boolean mkdir = file1.mkdir();
7 if(mkdir){
8 System.out.println("创建成功1");
9 }
10
11 File file2 = new File("D:\\IO\\IO1\\IO4");
12
13 boolean mkdir1 = file2.mkdirs();
14 if(mkdir1){
15 System.out.println("创建成功2");
16 }
17
18 }
如果没有 IO3 的上级目录,则 file1 不会创建成功,而 file2 无论是否有上级目录,都会创建成功。
5、File 类的删除功能
public boolean delete(): 删除文件或者文件夹
删除注意事项:
(1)Java 中的删除不走回收站。
(2)要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
Demo :
1 @Test
2 public void test7() {
3 File file = new File("D:\\Java—Workspaceing\\IO");
4 //要想删除成功,io4文件目录下不能有子目录或文件
5 System.out.println(file.delete());
6 }
六、案例
1、断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
代码:
1 @Test
2 public void test1() {
3 File srcFile = new File("D:\\img");
4
5 String[] fileNames = srcFile.list();
6 for (String fileName : fileNames) {
7 if (fileName.endsWith(".jpg")) {
8 System.out.println(fileName);
9 }
10 }
11 }
12
13
14 @Test
15 public void test2() {
16 File srcFile = new File("D:\\img");
17
18 File[] listFiles = srcFile.listFiles();
19 for (File file : listFiles) {
20 if (file.getName().endsWith(".jpg")) {
21 System.out.println(file.getAbsolutePath());
22 }
23 }
24 }
25
26
27 /**
28 * File类提供了两个文件过滤器方法
29 * public String[] list(FilenameFilter filter)
30 * public File[] listFiles(FileFilter filter)
31 */
32 @Test
33 public void test3() {
34 File srcFile = new File("D:\\img");
35
36 File[] listFiles = srcFile.listFiles(new FilenameFilter() {
37 @Override
38 public boolean accept(File dir, String name) {
39 return name.endsWith(".jpg");
40 }
41 });
42
43 for (File file : listFiles) {
44 System.out.println(file.getAbsolutePath());
45 }
46 }
2、遍历指定目录所有文件名称,包括子文件目录中的文件。
代码:
1 //打印目录下所有的文件
2 public static void printSubFile(File dir) {
3 File[] listFiles = dir.listFiles();
4
5 for (File file : listFiles) {
6 if (file.isDirectory()) { //文件目录
7 printSubFile(file);
8 } else { //文件
9 System.out.println(file.getAbsolutePath());
10 }
11 }
12 }
13
14 //列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
15 public static void listAllSubFiles(File file) {
16 if (file.isFile()) {
17 System.out.println(file.getAbsolutePath());
18 } else {
19 File[] listFiles = file.listFiles();
20 // 如果all[i]是文件,直接打印
21 // 如果all[i]是目录,接着再获取它的下一级
22 for (File f : listFiles) {
23 listAllSubFiles(f);
24 }
25 }
26 }
3、求指定目录所在空间的大小(求任意一个目录的总大小)
代码:
1 public static long getDirectorySize(File file) {
2 // file是文件,那么直接返回file.length()
3 // file是目录,把它的下一级的所有大小加起来就是它的总大小
4
5 long size = 0;
6
7 if (file.isFile()) {
8 size += file.length();
9 } else {
10 File[] listFiles = file.listFiles(); //获取file的下一级
11
12 // 累加all[i]的大小
13 for (File f : listFiles) {
14 size += getDirectorySize(f);
15 }
16 }
17
18 return size;
19 }
4、删除指定文件目录及其下的所有文件
代码:
1 public static void deleteDirectory(File file) {
2 // 如果file是文件,直接delete
3 // 如果file是目录,先把它的下一级干掉,然后删除自己
4 if (file.isDirectory()) {
5 File[] listFiles = file.listFiles();
6 //循环删除的是 file 的下一级
7 for (File f : listFiles) {
8 deleteDirectory(f);
9 }
10 }
11 //删除自己
12 file.delete();
13 }
5、拷贝目录
1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.FileOutputStream;
4 import java.io.IOException;
5
6 public class FileUtils {
7
8 //复制文件
9 public static void copyFile(File src, File dest) throws IOException{
10 if(!src.isFile()){
11 throw new RuntimeException(src.getPath() + "不存在");
12 }
13 FileInputStream fis = new FileInputStream(src);
14 FileOutputStream fos = new FileOutputStream(dest);
15
16 byte[] data = new byte[1024];
17 int len;
18 while((len = fis.read(data))!=-1){
19 fos.write(data, 0, len);
20 }
21
22 fos.close();
23 fis.close();
24 }
25
26 //复制文件夹
27 public static void copyDirectory(File srcDir,File destDir)throws IOException{
28 //父目录不能拷贝到子目录中
29 if(destDir.getAbsolutePath().contains(srcDir.getAbsolutePath())){
30 throw new IOException("父目录不能拷贝到子目录中");
31 }
32 if(!destDir.isDirectory()){
33 throw new IOException("目标对象不是目录");
34 }
35 File dest = new File(destDir,srcDir.getName());
36 //如果srcDir是个文件,那么直接复制文件到destDir中
37 if(srcDir.isFile()){
38 copyFile(srcDir, dest);
39 }else{
40 dest.mkdirs();//先在destPath目录中创建srcDir对应的文件夹
41 File[] list = srcDir.listFiles();//准备复制srcDir的子目录或子文件
42 for(File f: list){
43 copyDirectory(f,dest);
44 }
45 }
46 }
47 }
6、剪切目录
1 //剪切文件夹
2 public static void cutDirectory(File srcDir,File destDir)throws IOException{
3 if(destDir.getAbsolutePath().contains(srcDir.getAbsolutePath())){
4 throw new IOException("父目录不能剪切到子目录中");
5 }
6 if(!destDir.isDirectory()){
7 throw new IOException("目标对象不是目录");
8 }
9 File dest = new File(destDir,srcDir.getName());
10 if(srcDir.isFile()){
11 copyFile(srcDir, dest);
12 }else{
13 dest.mkdirs();
14 File[] list = srcDir.listFiles();
15 for(File f: list){
16 cutDirectory(f,dest);
17 }
18 }
19 srcDir.delete();
20 }
七、File 总结