前言


     IO流通常会用到很多地方,比如文件上传下载、传输、设计模式等,基础的知识扎实了才会有更高级的方法(Ftp工具类制作、web端文件上传工具)。
    对于使用IO流来说,需要明确几个点.

1.明确操作的源是目标源码还是数据源
2.明确要操作的数据是字节还是文本
3.明确数据所在的具体设别
4.明确是否需要额外的功能。

1. File类

    File概述
        File类 java.io.File
        1.主要对文件进行操作,不对文件内容进行处理于操作。
        2.是文件和目录路径名的抽象表示,主要用于文件和目录的创建,查询和删除操作。

1.1 构造方法

<center>

Constructor and Description
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
File(URI url) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

</center>

如何理解这三个构造方法

        File(String pathname) 1.通过路径字符串转换为抽象路径来创建File对象
        File(String parent, String child) 2.通过父路径字符串和子路径的字符串来创建File对象
        File(File parent, String child) 3.通过父File对象和子路径字符串创建File对象
        File(URI url) 4.通过完整的Url地址创建File对象

读完这三句话基本上已经对File构造方法已经有了一定的概念,再把他们都用起来就知道这些东西道理是干嘛的了。

/**
* 构造方法一、File(String pathname)
*/
String pathName = "C\\a.txt";
File file = new File(pathName); --- 相当于C:\\a.txt

/**
* 构造方法二、File(String parent,  String child)
*/
String parentPath = "C:\\";
String childPath = "a.txt";
File file1 = new File(parentPath,childPath);    --- 相当于C:\\a.txt

/**
* 构造方法三、File(File parent, String child)
*/
// 通过父级File对象和子路径字符串
File parentDir = new File("F:\\aaa");
String child = "bbb.txt";
File file2 = new File(parentDir, child); --------相当于C:\\a.txt

/**
* 构造方法四、File(URI url)
*/
// 文件路径名
String path2 = "C:\\a.txt";
File file3 = new File(path2);     -------------相当于C:\\a.txt

1. 一个File对象代表硬盘中实际存在的一个文件或者目录。

2. File类构造方法不会给你检验这个文件或文件夹是否真实存在,因此无论该路径下是否存在文件或者目录,都不影响File对象的创建。

1.2 常用方法

主要分为获取功能、获取绝对路径和相对路径、判断功能、创建删除功能的方法

1.2.1 获取功能的方法
  1. getAbsolutePath() 返回类型String,该方法返回抽象路径的绝对路径名。
  2. getPath() 返回类型String 抽象路径名转换为路径名字符串。
  3. getName() 返回类型String 抽象路径名表示的文件或目录名称。
  4. getLength() 返回类型Long 返回抽象路径名表示的文件的长度。

代码测试

File file = new File("C:\\a.txt");
System.out.println("抽象路径的绝对路径名" + file.getAbsolutePath());
System.out.println("抽象路径的路径字符串" + file.getPath());
System.out.println("抽象路径的文件或目录名" + file.getName());
System.out.println("抽象路径表示的文件的长度" + file.length());

打印输出内容:
抽象路径的绝对路径名C:\a.txt
抽象路径的路径字符串C:\a.txt
抽象路径的文件或目录名a.txt
抽象路径表示的文件的长度9

注意:length(),表示文件的长度。但是 File对象表示目录,则返回值未指定。

1.2.2 绝对路径和相对路径

相对路径:.//aaa//b.txt 一个简化的路径,不以盘符开头。
绝对路径:F://aaa//b.txt 一个完整的路径,以盘符开头。


1.路径不分大小写
2.路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

/**
* 绝对路径及相对路径
*/
//绝对路径
File file = new File("C:\\a.txt");
System.out.println(file.getAbsoluteFile());
//该file对象输出的抽象路径为`C:\a.txt`

//相对路径
File file2 = new File("a.txt");
System.out.println(file2.getAbsolutePath());
//使用相对路径输出的地址为:C:\Users\****\Desktop\J 287\Day 01\Dome_one\a.txt

关于相对路径写法有不同,所以在这里就不做阐述了。

1.2.3判断功能的方法

Jdk1.8中所具备的判断功能

booleanisAbsolute() 测试这个抽象路径名是否是绝对的。
booleanisDirectory() 测试此抽象路径名表示的文件是否为目录。
booleanisFile() 测试此抽象路径名表示的文件是否为普通文件。
booleanisHidden() 测试此抽象路径名命名的文件是否为隐藏文件。

方法演示

/**
* File 判断功能
* isDirectory()
* isAbsolute()
* isFile()
* isHidden()
*/
File file = new File("C:\\a.txt");

System.out.println("抽象路径名表示的文件是否为目录:" + file.isDirectory());
System.out.println("抽象路径名表示的路径是否为绝对路径:" + file.isAbsolute());
System.out.println("抽象路径名表示的文件是否为文件:" + file.isFile());
System.out.println("抽象文件名表示的文件是否为隐藏文件:" + file.isHidden());

----------------最终结果-------------
抽象路径名表示的文件是否为目录:false
抽象路径名表示的路径是否为绝对路径:true
抽象路径名表示的文件是否为文件:true
抽象文件名表示的文件是否为隐藏文件:false
1.2.4 创建删除功能的方法
booleanmkdir() 创建由此抽象路径名命名的目录。
boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
booleandelete() 删除由此抽象路径名表示的文件或目录。
booleancreateNewFile()当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。


mkdir()mkdirs() 同为创建目录,但是不同的是 mkdir() 只会在指定的路径下创建文件夹(创建一级目录)而 mkdirs() 会创建整个抽象路径中的目录(多级目录)(父目录及子目录一并进行创建).

使用方法

/**  
* File 创建删除创建功能方法
*/
 // 文件的创建
File f = new File("C:\\aaa.txt");
System.out.println("是否存在:"+f.exists()); // false
System.out.println("是否创建:"+f.createNewFile()); // true
System.out.println("是否创建:"+f.createNewFile()); // 以及创建过了所以再使用createNewFile返回false
System.out.println("是否存在:"+f.exists()); // true

// 目录的创建
 File f2= new File("C:\\newDir");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir());    // true
System.out.println("是否存在:"+f2.exists());// true

// 创建多级目录
File f3= new File("C:\\newDira\\newDirb");
System.out.println(f3.mkdir());// false
File f4= new File("C:\\newDira\\newDirb");
System.out.println(f4.mkdirs());// true

// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false

注意:delete方法,如果此 File表示目录,则目录必须为空才能删除。

1.3 目录的遍历

String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[]listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。

代码演示

/**
 * 遍历目录中的文件或目录
*/
File dir = new File("C:\\FileTest");

//获取当前目录下的文件以及文件夹的名称。
String[] names = dir.list();
for(String name : names){
    System.out.println(name);
}
System.out.println("================分隔符=================");
 
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files = dir.listFiles();
for (File file : files) {
    System.out.println(file);
}

遍历结果

a.txt
b.txt
bk.jpg
c.txt
Dir_four
Dir_one
Dir_three
Dir_two
Info.txt
stu.txt
Student.txt
test.txt
//以上是使用list方法进行的遍历,会将当前抽象路径中的所有文件及文件夹。但不会继续向下查找文件或文件夹
================分隔符=================
//以下是使用listFiles()方法进行遍历得到的结果,最终会放回多个File对象,这样可以进行操作的范围就随着扩大了。
C:\FileTest\a.txt
C:\FileTest\b.txt
C:\FileTest\bk.jpg
C:\FileTest\c.txt
C:\FileTest\Dir_four
C:\FileTest\Dir_one
C:\FileTest\Dir_three
C:\FileTest\Dir_two
C:\FileTest\Info.txt
C:\FileTest\stu.txt
C:\FileTest\Student.txt
C:\FileTest\test.txt


listFiles在获取指定目录下的文件或者文件夹时必须满足下面两个条件

1,指定的目录必须存在

2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException异常

1.3.1 递归遍历文件夹下所有的文件及子文件
/**
  * 递归遍历文件夹下所有文件及子文件
  */
File file = new File("D:\\java专属IO测试");
Recursion(file);
 //普通方法
public static void Recursion(File file) {
        //1、判断传入的是否是目录
        if (!file.isDirectory()) {
            //不是目录直接退出
            return;
        }
        //已经确保了传入的file是目录
        File[] files = file.listFiles();
        //遍历files
        for (File f : files) {
            //如果该目录下文件还是个文件夹就再进行递归遍历其子目录
            if (f.isDirectory()) {
                //递归
                Recursion(f);
            } else {
                //如果该目录下文件是个文件,则打印对应的名字
                System.out.println(f.getName());
            }

        }
    }

File 就温习到这里了,很多东西都用过,为了记忆深刻,学学学,冲冲冲。

最后修改:2022 年 03 月 17 日
如果觉得我的文章对你有用,请随意赞赏