Java SE 高级开发之Java IO 之 File(文件操作)

File文件操作类

在Java.io包之中,File类是唯一一个与文件本身操作(创建、删除、取得信息..)有关的程序类。

File类的基本使用
java.io.File类是一个普通的类,直接产生实例化对象即可。如果要实例化对象则需要使用到两个构造方法:

public File(String pathname) ;
public File(String parent, String child);//设置父路径和子路径。

如果要想进行文件的基本操作,可以使用File类的如下方法:

创建一个新文件 :
public boolean createNewFile() throws IOException

例:在指定路径下创建新文件

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:\\Users\\贵军\\Desktop\\testIO.java");
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

File类只是创建文件本身,但是对于其内容并不做处理。
其他一些常用方法

判断文件是否存在:
public boolean exists()
删除文件:
public boolean delete()

例:编写文件的基本操作(如果文件不存在则进行创建;存在则删除)

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:\\Users\\贵军\\Desktop\\testIO.java");
        if(file.exists()) {     //如果文件存在
            file.delete();      //则删除
        } else {                //文件不存在
            try {
                file.createNewFile();   //则进行创建
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

以上实现了最简化的文件处理操作,但是代码存在两个问题:

实际项目部署环境可能与开发环境不同。那么这个时候路径的问题就很麻烦了。windows下使用的是”\”,而Unix系统下使用的是”/”。所以在使用路径分隔符时都会采用File类的一个常量”public static final String separator “来描述。

separator由不同操作系统下的JVM来决定到底是哪个杠杠!
因此以上指定文件路径的语句就可以改写为

//定义要操作的文件路径
        File file = new File(
                "C:"+File.separator+"Users"+File.separator+"贵军"+
        File.separator+"Desktop"+File.separator+"testIO.java");

注意:在Java中要进行文件的处理操作是要通过本地操作系统支持的,在这之中如果操作的是同名文件,就可能出现延迟的问题。(开发之中尽可能避免文件重名问题)

目录操作

File类中关于目录有如下方法:

取得父路径或父File对象:
public String getParent()
public File getParentFile()

若想创建父路径,此时最好取得父路径的File类对象。

创建目录(无论有多少级父目录,都会创建)
public boolean mkdirs()

例:Java文件目录操作

public class Test {
    public static void main(String[] args) {
        //separator由不同的操作系统下的JVM来决定到底是哪个杠杠!!!
        File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
        File.separator+"Desktop"
                +File.separator+"JavaIO"+File.separator+"bit"+File.separator+"testIO.java");
        if(!file.getParentFile().exists()) {        //如果文件testIO.java的父目录不存在
            file.getParentFile().mkdirs();          //则有多少级父目录就创建多少级父目录
        }
        if(file.exists()) {                         //如果文件存在
            file.delete();                          //则进行删除
        } else {                                    //否则
            try {
                file.createNewFile();               //进行创建文件
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

取得文件信息
在File类里面提供有一系列取得文件信息的操作:

判断路径是否是文件: public boolean isFile();
判断路径是否是目录: public boolean isDirectory();
取得文件大小(字节): public long length();
最后一次修改日期 : public long lastModified();

例:取得文件信息

public class Test {
    public static void main(String[] args) {
        //要操作的文件
        File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
                File.separator+"Desktop"+File.separator+"test.png");
        //上面给定的父目录都存在,如果不存在则需要先创建父路径
        if(file.exists() && file.isFile()) {        //如果文件存在再进行操作
            System.out.println("文件大小: " + file.length());
            System.out.println("最后一次修改文件的日期: " + new Date(file.lastModified()));
        } else {                                    //如果文件不存在时
            try {
                System.out.println("文件不存在则先进行创建");
                file.createNewFile();               //先进行文件创建
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(file.exists() && file.isFile()) {    //再一次确定文件存在了再进行操作
                System.out.println("文件大小: " + file.length());
                System.out.println("最后一次修改文件的日期: " + new Date(file.lastModified()));
            }
        }
    }
}

运行结果
这里写图片描述
以上操作都是针对文件进行信息取得,Java里也提供有如下方法列出一个目录的全部组成:

public File[] listFiles();

例:列出目录中的全部组成

public class Test {
    public static void main(String[] args) {
        //要操作的文件
        File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
                File.separator+"Desktop");
        if(file.exists() && file.isDirectory()) {
            //列出目录中的全部内容
            File[] files = file.listFiles();
            for(File i : files) {
                System.out.println(i);
            }
        }
    }
}

这里写图片描述

综合案例(目录列表)
虽然File提供有listFiles()方法,但是这个方法本身只能够列出本目录中的第一级信息。如果要求列出目录中所有级的信息,必须自己来处理。这种操作就必须通过递归的模式来完成。
例:递归打印当前目录下所有层级的文件信息

public class Test {
    public static void main(String[] args) {
        //指定路径
        File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
                File.separator+"Desktop"+File.separator+"JavaIO");
        listAllFiles(file);
    }
    public static void listAllFiles(File file) {
        if(file.isDirectory()) {                    //判断是目录就继续进入
            File[] files = file.listFiles();        //继续列出子目录
            for(int i = 0; i < files.length; i++) { //对每个子目录都进行递归
                listAllFiles(files[i]);
            }
        } else {                                    //是文件就直接打印
            System.out.println(file);
        }
    }
}

线程阻塞问题:
现在所有代码都是在main线程下完成的,如果listAllFiles()方法没有完成,那么对于main后续的执行将无法完成。这种耗时的操作让主线程出现了阻塞,而导致后续代码无法正常执行完毕。如果不想让阻塞产生,最好再产生一个新的线程进行处理。

例:新增子线程进行耗时操作

public class Test {
    public static void main(String[] args) {
        //开启子线程进行处理
        new Thread(()-> {
            File file = new File("C:"+File.separator+"Users"+File.separator+"贵军"+
                File.separator+"Desktop"+File.separator+"JavaIO");
            listAllFiles(file);
        }).start();
        System.out.println("开始进行文件输出");
    }
    public static void listAllFiles(File file) {
        if(file.isDirectory()) {                    //判断是目录就继续进入
            File[] files = file.listFiles();        //继续列出子目录
            for(int i = 0; i < files.length; i++) { //对每个子目录都进行递归
                listAllFiles(files[i]);
            }
        } else {                                    //是文件就直接打印
            System.out.println(file);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Guijun6/article/details/80380292