Java IO流:(一)File 文件类

一、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 总结

原文地址:https://www.cnblogs.com/niujifei/p/14825211.html