java I/O———File文件操作类

如果要学好IO,必须清楚抽象类;IO的操作部分重点掌握两个代码模型。IO的核心组成就是五个类(File、OutputStream、InputStream、Reader、Writer)一个接口(Serializable)

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

File类使用

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

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

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

①创建一个新文件 :

public boolean createNewFile() throws IOException

范例:创建新文件

import java.io.File;
import java.io.IOException;
public class TestIO {
    public static void main(String[] args) {
    // 定义要操作的文件路径
        File file = new File("/Users/yuisama/Desktop/TestIO.java");
        try {
            file.createNewFile() ;
            } catch (IOException e) {
                 e.printStackTrace();
            }
        }
   }

File类只是创建文件本身,但是对于其内容并不做处理。

②判断文件是否存在:

public boolean exists()

③删除文件:

public boolean delete()

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

在这里插入图片描述
以上实现了最简化的文件处理操作,但是代码存在两个问题:

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

// separator由不同操作系统下的JVM来决定到底是哪个杠杠!
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
   File.separator + "Desktop" + File.separator + "TestIO.java");

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

目录操作

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

*取得父路径或父File对象:

public String getParent()
public File getParentFile()

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

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

public boolean mkdirs()

范例:Java文件目录操作
在这里插入图片描述

以上判断父目录是否存在以及父目录的创建操作非常重要,对于后续开发很重要。

文件信息

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

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

范例:取得文件信息

在这里插入图片描述
以上操作都是针对文件进行信息取得,Java里也提供有如下方法列出一个目录的全部组成:public File[] listFiles()

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

import java.io.File;
import java.io.IOException;
public class TestIO {
public static void main(String[] args) throws IOException {
// 要操作的文件
      File file = new File(File.separator + "Users" + File.File.separator + "yuisama" + File.separator + "Desktop");
// 保证是个目录且存在
    if (file.exists() && file.isDirectory()) {
// 列出目录中的全部内容
        File[] result = file.listFiles() ;
        for (File file2 : result) {
             System.out.println(file2);
        }
    }
}

以上这些操作可以取得本地文件的相关信息

综合案例(目录列表)

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

范例:递归打印当前目录下所有层级的文件信息

在这里插入图片描述

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

范例:新增子线程进行耗时操作
在这里插入图片描述

对于以上操作,如果将输出变为删除就可以成为一个恶意程序了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章