JavaSE之File文件操作类


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

File类的基本使用

File类的构造方法:

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

创建一个新文件:

public boolean createNewFile() throws IOException//受查异常,同一个目录下一个文件不能被创建两次

判断文件(夹)是否存在:

public boolean exists();

删除文件:

public boolean delete();

范例:文件的基本操作

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:\\Users\\Administrator\\Desktop\\IOjava.java");
        //如果文件不存在,就创建一个新文件
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            //文件存在就删除当前文件
            System.out.println("file exists");
            file.delete();
        }
    }
}

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

如果我们使用的环境不同,路径的问题就很麻烦了。windows下使用的是"//",而Unix系统下使用的是"/"。

解决方法:在使用路径分隔符时采用File类的一个常量"public static finalString separator "来描述,他会根据环境的不同来变换路径分隔符。
范例:

import java.io.*;
import java.io.File;

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:Users"+File.separator+"Administrator"+File.separator+"Desktop"+File.separator+"IOjava.java");
        System.out.println(file);
        //如果文件不存在,就创建一个新文件
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            //文件存在就删除当前文件
            System.out.println("file exists");
            file.delete();
        }
    }
}

运行结果:自动替换了分隔符
在这里插入图片描述

目录操作

取得父路径或父File对象:

public String getParent();
public File getParentFile();

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

public boolean mkdirs();

范例:

import java.io.*;
import java.io.File;

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:Users"+File.separator+"Administrator"
                +File.separator+"Desktop"+File.separator+"www"+File.separator+"HE"+File.separator+"IO"+File.separator+"IOjava.java");
        File parentfile=file.getParentFile();//获得父目录文件
        //如果父目录不存在,创建父目录
        if(!parentfile.exists()){
            parentfile.mkdirs();
        }
        //如果文件不存在,就创建一个新文件
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            //文件存在就删除当前文件
            System.out.println("file exists");
            file.delete();
        }
    }
}

文件信息操作

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

  1. 判断路径是否是文件: public boolean isFile();
  2. 判断路径是否是目录: public boolean isDirectory();
  3. 取得文件大小(字节): public long length();
  4. 最后一次修改日期 : public long lastModified();//返回:表示文件最后一次被修改的时间的 long 值,用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)。如果该文件不存在,或是发生 I/O 错误,则返回 0L,抛出异常。所以我们一般使用一个日期类将这个值转换为时间格式。
    范例:

import java.io.File;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:Users" + File.separator + "Administrator"
                + File.separator + "Desktop" + File.separator + "peter.jpg");
        if (file.exists() && file.isFile()) {
            System.out.println(file.length()/1024);//取得文件大小(KB)
            System.out.println(new Date(file.lastModified()));//获取文件最后一次修改的时间
        }

    }
}

应用:列出目录中的全部组成

 public File[] listFiles();
import java.io.File;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        //定义要操作的文件路径
        File file = new File("C:Users" + File.separator + "Administrator"
                + File.separator + "Desktop");
        System.out.println("开始遍历文件.....");
        long start=System.currentTimeMillis();
        if(file.exists()&&file.isDirectory()) {
            F(file);//递归实现目录中目录的展开
        }
        System.out.println("结束遍历文件.....");
        long end=System.currentTimeMillis();
        System.out.println("耗时->"+(end-start));
    }
    public static void F(File f){
        if(f.exists()&&f.isFile()){
            System.out.println(f);
            return ;
        }
        File[] files = f.listFiles();
        if(files!=null){
        for (File ff : files) {
            F(ff);
        }
    }
    }
}

线程阻塞问题:

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

import java.io.File;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        System.out.println("main begin.....");
        new Thread(()-> {
            File file = new File("C:Users" + File.separator + "Administrator"
                    + File.separator + "Desktop");
            long start = System.currentTimeMillis();
            if (file.exists() && file.isDirectory()) {
                F(file);//递归实现目录中目录的展开
            }
        }).start();
        System.out.println("main end.....");
    }
    public static void F(File f){
        if(f.exists()&&f.isFile()){
            System.out.println(f);
            return ;
        }
        File[] files = f.listFiles();
        for (File ff : files) {
            F(ff);
        }
    }
}

但是,以上操作如果将输出变为删除就可以成为一个恶意程序了~~~所以操作需谨慎呀~

发布了87 篇原创文章 · 获赞 73 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/84836444