前言
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.2 常用方法
主要分为获取功能、获取绝对路径和相对路径、判断功能、创建删除功能的方法
1.2.1 获取功能的方法
getAbsolutePath()
返回类型String,该方法返回抽象路径的绝对路径名。getPath()
返回类型String 抽象路径名转换为路径名字符串。getName()
返回类型String 抽象路径名表示的文件或目录名称。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中所具备的判断功能
boolean | isAbsolute() 测试这个抽象路径名是否是绝对的。 |
---|---|
boolean | isDirectory() 测试此抽象路径名表示的文件是否为目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否为普通文件。 |
boolean | isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。 |
方法演示
/**
* 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 创建删除功能的方法
boolean | mkdir() 创建由此抽象路径名命名的目录。 |
---|---|
boolean | mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
boolean | delete() 删除由此抽象路径名表示的文件或目录。 |
boolean | createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
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 就温习到这里了,很多东西都用过,为了记忆深刻,学学学,冲冲冲。