File
位于Java.io包,表示文件或文件夹
Java是跨平台的,不同的操作系统路径的分隔符不一样 window:\ linux,max:/
Java中写路径时使用 / Linux和max都能识别,\在Java中表示转义
File类是“文件和目录路径名的抽象表示”。而不是指文件的内容。
File的功能
对文件或者文件夹进行 创建, 删除,查看等操作, 但是不能读取文件的内容
(只能对文件本身进行操作,不能对文件内容操作)
区分不同的操作系统
使用File的静态常量 public static final String separator
path分隔符
Linux操作系统 :
window ;
public static final char pathSeparatorChar
File构造方法
//完整路径
File file = new File("D:/test.txt");
//上级目录
File file1 = new File("D:/图片","1.jpg");
//也可以这样
File parent = new File("D:/图片");
File file2 = new File(parent, "1.jpg");
//文件夹
File file3 = new File("D:\\nginx-1.18.0\\conf");
常见方法
判断文件或者文件夹是否存在 public boolean exists()
//判断文件/文件夹是否存在
System.out.println(file.exists());//boolean
System.out.println("是否是文件:"+file.isFile()); //boolean
System.out.println("是否是目录:"+file3.isDirectory());//boolean
创建文件: 如果是空文件,不能给文件添加内容. 如果上级目录不存在, 抛异常:IOException
创建文件夹: 推荐使用 mkdirs()
mkdir() 只创建本级文件夹, 如果上级目录不存在, 创建失败, 如果上级目录存在, 创建本级目录
mkdirs() 如果上级目录不存在,创建所有的上级目录, 再创建本级目录, 如果上级目录存在与mkdir() 一样 推荐
删除文件/文件夹: 如果该目录是一个空目录: 可以删除 如果目录是非空的, 删除失败
遍历子文件或者是子文件夹
String[] subFileStrs = file.list();
for (String subFileStr : subFileStrs) {
System.out.println(subFileStr);
}
//使用FilenameFilter过滤 获取某个文件夹下的特定文件
String[] subFileStrs = file.list(new FilenameFilter() {
//把目录下每一个子文件或者子目录, 调用一次accept()
//根据accept()方法返回值,判断是否添加到subFileStrs数组
// 如果返回值true,添加, false: 不添加
//dir: 上级目录 name: 子文件/子文件夹的名字
@Override
public boolean accept(File dir, String name) {
//false: 过滤掉
//getPath() 获取路径
//得到 子文件/子文件夹File对象
File subFile = new File(dir,name);
return subFile.isFile() && name.endsWith(".txt");//不要文件夹,不是txt结尾的也不要
}
});
for (String subFileStr : subFileStrs) {
System.out.println(subFileStr);
}
//上面返回的是String数组list() 这个返回的是File数组 listFiles()
//返回File数组
File[] subFiles = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File subFile = new File(dir,name);
return subFile.isFile() && name.endsWith(".txt") ;
}
});
for (File subFile : subFiles) {
// getParent() 获取上级目录路径
//getParentFile() 获取上级目录File对象
System.out.println(subFile.getPath());
}
//使用FileFilter过滤
File[] subFiles = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//System.out.println(pathname.getPath());
return pathname.isFile();
}
});
方法递归
在方法内部调用本方法,实现重复的操作(循环)
使用场景:循环的条件不确定时
递归要求:
1:参数要发生改变
2:要有结束递归的终点,否则就会进入死循环
递归缺点:
1:如果递归的层次很深 :执行效率低,内存消耗大
能用循环就不用递归
例子:斐波那契数列
1,1,2,3,5,8,13,21,34,55…
f(10) = f(9)+f(8)
f(9) = f(8)+f(7)
f(8) = f(7) + f(6)
f(6)=…
f(5) = f(4)+f(3)=3+2=5
f(4)=f(3)+f(2)=2+1=3
f(3) = f(2)+f(1); = 1+1=2
f(2) = 1; 终点
f(1) = 1;
使用递归的到所有的子文件
public static void iterSubFile(File file){
File[] subFiles = file.listFiles();
for (File subFile : subFiles) {
//getName() 文件名/文件夹名
//System.out.println(subFile.getName());
//递归
if(subFile.isDirectory()){
//文件夹
iterSubFile(subFile);
}else{
//文件
subFile.delete();
}
}
//删除空目录
file.delete();
}
IO流
I input ; O output 统称为数据流。(IO Stream)
IO分类
按流向分:
◦ 输入流:程序可以从中读取数据的流(读操作)
◦ 输出流:程序能向其中写入数据的流(写操作)
按数据传输单位分:
◦ 字节流:以字节(8位)为单位传输数据的流
◦ 字符流:以字符(16位)为单位传输数据的流 读写文本文件
按功能分:
◦ 节点流:用于直接操作目标设备的流
◦ 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更强大、灵活的读写功能。
IO流的4个抽象父类
字节输入流: InputStream
字节输出流: OutputStream
字符输入流: Reader
字符输出流: Writer
InputStream字节输入流
常用方法
read(): 从输入流中读取数据的下一个字节, 返回读到的字节值(int型).若读到末尾,返回-1 (一次读取一个字节)
read(byte[] b):从输入流中读取 b.length 个字节的数据并存储到缓冲区数组b中.返回的是实际读到的字节总数(一次最多可以读取b.length 个字节的数据)
read(byte[] b, int off, int len):读取 len 个字节的数据,并从数组b的off位置开始存入到这个数组中
close():关闭此输入流并释放与此流关联的所有系统资源
OutputStream字节输出流
继承自OutputStream的流是程序用于向外输出数据的,且数据的单位为字节(8位)
常用方法
write(int b):将指定的字节写入此输出流
write(byte[] b) :将 b.length 个字节从指定的 byte 数组写入此输出流
flush():刷新此输出流并强制写出所有缓冲的输出字节
close():关闭此输出流并释放与此流有关的所有系统资源
Writer字符输出流
继承Writer的流都是向程序中输出数据,且数据的单位为字符(16 bit)
常用方法
write(int c):写入单个字符
write(char[] cbuf) :写入字符数组
write(char[] cbuf, int off, int len):写入字符数组的某一部分
write(String str):写入字符串
write(String str,int off, int len):写字符串的某一部分
close() :关闭此流,但要先刷新它
flush() :刷新该流的缓冲,将缓冲的数据全写到目的地
Reader字符输入流
继承自Reader的流都是用于向程序中输入数据的,且数据的单位为字符(16位),
read():读取单个字符,返回作为整数读取的字符,如果已到结尾返回-1
read(char[] cbuf):将字符读入数组,返回读取的字符数
int read(char[] cbuf,int off, int len):读取 len 个字符的数据,并从数组cbuf的off位置开始存入到这个数组中
close():关闭该流并释放与之关联的所有资源
编写步骤:
- 创建IO流对象
- 读/写操作
- 关闭资源
节点流
节点流可以从一个特定的数据源(节点)读写数据(如:文件,内存),直接对文件进行读写,而不需要借助于其他的IO流