一、今日学习安排
1、目前是如何存储数据的?弊端是什么?
- 在内存中存储的数据是用来处理、修改、运算的,只是临时存储在内存中的,无法长久保存的。
2、计算机中,有没有一块硬件是可以永久存储数据的?
- 磁盘中数据的形式就是文件,文件是数据的载体。
二、学习思路
1、先要定位文件
File类
可以定位文件:进行删除、获取文本本身信息等操作- 但是不能读写文件内容
2、读写文件数据
IO流
技术可以对硬盘中的文件进行读写
3、总体学习思路
- 先学会使用File类定位文件以及操作文件本身
- 然后学习IO流读写文件数据
三、关于File、IO流,需要学会什么?
1、File类使用
- 能够使用File的对象操作文件,如:删除、获取文件信息、创建文件夹等
2、方法递归
- 理解递归算法思想并能完成常见递归题目,以及文件搜索
3、字符集
- 程序中经常要读取文件中的数据,程序员必须先知道数据的底层形式才能够去学习如何读写数据的
4、IO流的作用、分类
- 能够使用IO流完成文件数据的读写等操作
5、字节、字符流
- 数据的类型很多,要学会选择不同的流进行读写操作
四、File类
1、概述
- File类在包java.io.File下,代表操作系统的文件对象(文件、文件夹)
- File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(或文件夹)等功能。
2、File类创建对象
方法名称 | 说明 |
---|---|
public File(String pathname) | 根据群文件路径创建文件对象 |
public File(String parent, String child) | 从父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
- File对象可以定位文件和文件夹
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
package com.app.d1_file;
import java.io.File;
/**
目标:创建File对象定位操作系统的文件(文件、文件夹)
*/
public class FileDemo1 {
public static void main(String[] args) {
// 1、创建File对象(指定文件的路径)
/*
路径写法:
E:\JavaDevelop\images\1.jpg
E:/JavaDevelop/images/1.jpg
E:\JavaDevelop\images\1.jpg
E:"+ File.separator +"JavaDevelop"+ File.separator +"images"+ File.separator +"1.jpg (可以跨平台)
*/
// File file = new File("E:\\JavaDevelop\\images\\1.jpg");
File file = new File("E:/JavaDevelop/images/1.jpg");
// File file = new File("E:"+ File.separator +"JavaDevelop"+ File.separator +"images"+ File.separator +"1.jpg");
long size = file.length(); // 获取文件的字节大小
System.out.println("文件的字节大小是:" +size);
// 2、File创建对象,支持绝对路径,支持相对路径(重点)
File file1 = new File("E:\\JavaDevelop\\images\\2.jpg"); // 绝对路径
System.out.println(file1.length());
// 相对路径:一般定位模块中的文件的。相对到工程下!!
File file2 = new File("day10-file-io-app/src/data.txt");
System.out.println(file2.length());
// 3、File创建对象,可以是文件也可以是文件夹
File file3 = new File("E:/JavaDevelop/images");
System.out.println(file3.length()); // 注意:文件夹是不能获取字节大小的,会给个假数据
System.out.println(file3.exists()); // 判断文件或文件夹是否存在
}
}
文件的字节大小是:808881
768737
6
4096
true
Process finished with exit code 0
3、绝对路径和相对路径
-
绝对路径:从盘符开始
File file1 = new File("D:\\app\\a.txt");
-
相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。
File file2 = new File("模块名\\a.txt");
总结
1、File类的作用?
- 创建对象定位文件,可以删除、获取文件信息等。但是不能读写文件内容。
2、File类构建对象的方式?
File file = new File("文件/文件夹/绝对路径/相对路径");
3、绝对路径和相对路径是什么样的?
- 绝对路径是带盘符的,依赖当前系统。
- 相对路径是不带盘符的,默认相对到工程下开始寻找文件。
五、File类的常用API
1、判断文件类型、获取文件信息
方法名称 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为文件夹 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或文件夹的名称 |
public long lastModified() | 返回文件最后修改的时间毫秒值 |
package com.app.d1_file;
import java.io.File;
import java.text.SimpleDateFormat;
/**
目标:掌握File类的常用API的使用
*/
public class FileDemo02 {
public static void main(String[] args) {
// 1、绝对路径创建一个文件对象
File file1 = new File("E:/JavaDevelop/images/4.jpg");
// a.获取它的绝对路径
System.out.println("获取该文件的绝对路径:" + file1.getAbsolutePath());
// b.获取文件定义的时候使用的路径
System.out.println("获取该文件在定义时候使用的路径:" + file1.getPath());
// c.获取文件的名称:带后缀
System.out.println("获取该文件的名称(带后缀):" + file1.getName());
// d.获取文件的大小:字节个数
System.out.println("获取该文件的字节大小:" + file1.length());
// e.获取文件的最后修改时间(毫秒值)
System.out.println("获取该文件最后修改时间:");
long time = file1.lastModified();
System.out.println("格式化前:" + time);
// 将获取到的时间毫秒值转换成我们自己喜欢的格式
System.out.println("格式化后:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time));
// f、判断该文件是文件还是文件夹
System.out.println("该文件是否为文件:" + file1.isFile()); // true
System.out.println("该文件是否为文件夹:" + file1.isDirectory()); // false
// g.判断该文件或文件夹是否存在
System.out.println("该文件或文件夹是否存在:" + file1.exists()); // true
System.out.println("--------------------------------------------------");
// 2、相对路径路径创建一个文件对象
File file2 = new File("day10-file-io-app\\src\\data.txt");
// a.获取它的绝对路径
System.out.println("获取该文件的绝对路径:" + file2.getAbsolutePath());
// b.获取文件定义的时候使用的路径
System.out.println("获取该文件在定义时候使用的路径:" + file2.getPath());
// c.获取文件的名称:带后缀
System.out.println("获取该文件的名称(带后缀):" + file2.getName());
// d.获取文件的大小:字节个数
System.out.println("获取该文件的字节大小:" + file2.length());
// e.获取文件的最后修改时间(毫秒值)
System.out.println("获取该文件最后修改时间:");
long time2 = file2.lastModified();
System.out.println("格式化前:" + time2);
// 将获取到的时间毫秒值转换成我们自己喜欢的格式
System.out.println("格式化后:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2));
// f、判断该文件是文件还是文件夹
System.out.println("该文件是否为文件:" + file2.isFile()); // true
System.out.println("该文件是否为文件夹:" + file2.isDirectory()); // false
// g.判断该文件或文件夹是否存在
System.out.println("该文件或文件夹是否存在:" + file1.exists()); // true
System.out.println("--------------------------------------------------");
// 3、绝对路径创建一个文件对象
File file3 = new File("E:/");
// a.判断该文件是文件还是文件夹
System.out.println("该文件是否为文件:" + file3.isFile()); // false
System.out.println("该文件是否为文件夹:" + file3.isDirectory()); // true
// b.判断该文件或文件夹是否存在
System.out.println("该文件或文件夹是否存在:" + file1.exists()); // true
System.out.println("--------------------------------------------------");
// 4、不存在路径创建一个文件对象
File file4 = new File("E:/jjsfs");
// a.判断该文件是文件还是文件夹
System.out.println("该文件是否为文件:" + file4.isFile()); // false
System.out.println("该文件是否为文件夹:" + file4.isDirectory()); // false
// b.判断该文件或文件夹是否存在
System.out.println("该文件或文件夹是否存在:" + file4.exists()); // false
}
}
获取该文件的绝对路径:E:\JavaDevelop\images\4.jpg
获取该文件在定义时候使用的路径:E:\JavaDevelop\images\4.jpg
获取该文件的名称(带后缀):4.jpg
获取该文件的字节大小:505697
获取该文件最后修改时间:
格式化前:1620665560340
格式化后:2021-05-11 00:52:40
该文件是否为文件:true
该文件是否为文件夹:false
该文件或文件夹是否存在:true
--------------------------------------------------
获取该文件的绝对路径:E:\JavaDevelop\code01\javasepromax\day10-file-io-app\src\data.txt
获取该文件在定义时候使用的路径:day10-file-io-app\src\data.txt
获取该文件的名称(带后缀):data.txt
获取该文件的字节大小:6
获取该文件最后修改时间:
格式化前:1663335070867
格式化后:2022-09-16 21:31:10
该文件是否为文件:true
该文件是否为文件夹:false
该文件或文件夹是否存在:true
--------------------------------------------------
该文件是否为文件:false
该文件是否为文件夹:true
该文件或文件夹是否存在:true
--------------------------------------------------
该文件是否为文件:false
该文件是否为文件夹:false
该文件或文件夹是否存在:false
Process finished with exit code 0
2、创建文件、删除文件功能
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
public boolean delete() | 删除由此抽象路径名表示的文件或空文件夹 |
delete()
方法直接删除不走回收站;如果删除的是一个文件,且文件被占用也可直接删除。delete()
方法默认只能删除空文件夹。
package com.app.d1_file;
import java.io.File;
/**
目标:掌握File类的创建、删除文件的API的使用
*/
public class FileDemo03 {
public static void main(String[] args) throws Exception {
File file1 = new File("day10-file-io-app\\src\\data.txt");
// 1、创建新文件,创建成功返回true,失败返回true(几乎不用,因为以后文件都是自动创建的!)
System.out.println("创建data.txt文件是否成功:" + file1.createNewFile()); // false:因为data.txt文件已存在该路径下
File file2 = new File("day10-file-io-app\\src\\data02.txt");
File file3 = new File("day10-file-io-app\\src\\data03.txt");
System.out.println("创建data02.txt文件是否成功:" + file2.createNewFile()); // true:因为data02.txt文件未存在该路径下
System.out.println("创建data03.txt文件是否成功:" + file3.createNewFile()); // true
System.out.println("-----------------------------------");
// 2、mkdir创建一级目录
File file4 = new File("E:/JavaDevelop/FileDemo01");
// true:因为JavaDevelop目录已经存在,所以FileDemo01为一级目录,创建成功
System.out.println("创建一级目录FileDemo01是否成功:" + file4.mkdir());
// 3、mkdirs创建多级目录(重点)
File file5 = new File("E:/JavaDevelop/FileDemo02/aaa/bbb/ccc");
// false:因为JavaDevelop目录已经存在,FileDemo02、aaa、bbb这些目录皆都不存在,因此创建失败!!
System.out.println("创建一级目录ccc是否成功:" + file5.mkdir());
// true:因为mkdirs支持创建多级目录(建议使用)
System.out.println("创建多级目录是否成功:" + file5.mkdirs());
System.out.println("-----------------------------------");
// 4、删除文件或者空文件夹(只能删除空文件夹:因为java考虑到安全性,防止程序员误删,以免数据丢失无法找回)
System.out.println("删除data03.txt文件是否成功:" + file3.delete()); // true
File file6 = new File("E:\\JavaDevelop\\images\\5.jpg");
// true:就算你的文件是被占用着,也能直接删除掉
System.out.println("删除5.jpg文件是否成功:" + file6.delete());
System.out.println("删除空文件夹FileDemo01是否成功:" + file4.delete()); // true
// false:因为java考虑到安全性,防止程序员误删,以免数据丢失无法找回
File file7 = new File("E:/JavaDevelop/images");
System.out.println("删除非空文件夹images是否成功:" + file7.delete());
}
}
创建data.txt文件是否成功:false
创建data02.txt文件是否成功:true
创建data03.txt文件是否成功:true
-----------------------------------
创建一级目录FileDemo01是否成功:true
创建一级目录ccc是否成功:false
创建多级目录是否成功:true
-----------------------------------
删除data03.txt文件是否成功:true
删除5.jpg文件是否成功:true
删除空文件夹FileDemo01是否成功:true
删除非空文件夹images是否成功:false
Process finished with exit code 0
总结
1、创建多级目录使用哪个方法?
public boolean mkdirs()
2、删除文件需要注意什么?
- 可以删除文件、空文件夹,默认不能删除非空文件夹。
3、遍历文件夹
方法名称 | 说明 |
---|---|
public String[] list() | 获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回 |
public File[] listFiles() | 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(常用、重点) |
listFiles()方法注意事项:
- 当调用者不存在时,返回null。
- 当调用者是一个文件时,返回null。
- 当调用者是一个空文件夹时,返回一个长度为0的数组。
- 当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回。
- 当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容。
- 当调用者是一个需要权限才能进入的文件夹时,返回null。
package com.app.d1_file;
import java.io.File;
import java.util.Arrays;
/**
目标:掌握遍历文件夹的API,及listFiles()方法的注意事项
*/
public class FileDemo04 {
public static void main(String[] args) {
// 1、绝对路径创建一个文件对象
File file = new File("E:/JavaDevelop/images");
/*
2、获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回
注意:只能拿到一级文件名称,假如目录下还有文件或文件夹,是拿不到的
*/
String[] fileNames = file.list();
for (String fileName : fileNames) {
System.out.println(fileName);
}
System.out.println("----------------------");
/*
3、获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点、常用)
注意:只能拿到一级文件名称,假如目录下还有文件或文件夹,是拿不到的
*/
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f); // 输出的是文件或文件夹的绝对路径
}
System.out.println("----------------------");
/*
listFile()方法的注意事项:
1、当调用者不存在时,返回null
2、当调用者是一个文件时,返回null
3、当调用者是一个空文件夹时,返回一个长度为0的数组
4、当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中去返回
5、当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中去返回,包含隐藏的内容
6、当调用者是一个需要权限才能进入的文件夹时,返回null
*/
// 1
File dir = new File("E:/ggg"); // 调用者:不存在此文件夹
File[] files2 = dir.listFiles();
System.out.println("当该文件夹不存在时:" + files2); // null
// 2
File isFile = new File("E:/JavaDevelop/images/出师表.txt"); // 调用者:是一个文件
File[] files3 = isFile.listFiles();
System.out.println("当调用者是一个文件时:" + files3); // null
// 3
File emptyFile = new File("E:\\JavaDevelop\\images\\kong"); // 调用者:是一个空文件夹
File[] files4 = emptyFile.listFiles();
System.out.println("当调用者是一个空文件夹时:" + Arrays.toString(files4)); // []
}
}
2.jpg
3.jpg
4.jpg
aaa
data.txt
kong
出师表.txt
晚霞.jpg
----------------------
E:\JavaDevelop\images\2.jpg
E:\JavaDevelop\images\3.jpg
E:\JavaDevelop\images\4.jpg
E:\JavaDevelop\images\aaa
E:\JavaDevelop\images\data.txt
E:\JavaDevelop\images\kong
E:\JavaDevelop\images\出师表.txt
E:\JavaDevelop\images\晚霞.jpg
----------------------
当该文件夹不存在时:null
当调用者是一个文件时:null
当调用者是一个空文件夹时:[]
Process finished with exit code 0
总结
1、如何遍历文件夹下的文件对象?使用什么方法?有什么特点?
public File[] listFiles()
- 只能遍历当前文件夹对象下的一级文件对象。