黑马程序员技术交流社区
标题:
[石家庄校区]就业班JavaSE高级部分day08 File类 递归笔记
[打印本页]
作者:
湿漉漉的文字控
时间:
2018-11-26 15:48
标题:
[石家庄校区]就业班JavaSE高级部分day08 File类 递归笔记
就业班JavaSE高级部分day08 File类 递归笔记
File类:
IO:(
Input输入, Output输出
)
java.io.File类:
文件
和
目录
路径名的抽象表示形式
java把电脑中的文件和文件夹(目录)封装为一个File类,可以使用File类对文件和文件夹进行操作
String -> File
绝对路径,相对路径
绝对路径:
是一个完整的路径,以盘符开始
相对路径:
是一个简化的路径
相对的是当前目录的的根目录
如果使用当前项目的根目录,路径可以简写
java.io.File类: 文件和目录的路径名的抽象表现形式, 主要用于文件和目录的创建, 查找和删除等操作
// 静态成员变量
static String pathSeparator: 路径分隔符的字符串形式
static char pathSeparatorChar: 路径分隔符的char形式
Windows系统是 分号;
Linux系统是 冒号:
static String separator: 文件名称分隔符的字符串形式
static char separatorChar: 文件名称分隔符的char形式
Window系统是 反斜杠\
Linux系统是 正斜杠/
当使用分隔符时可以
c: File.separator a File.separator b.txt
注意事项:
路径不区分大小写(win不区分, Linux Mac区分)
路径一般写成字符串
,一个"\"是转义 所以要写两个"\\"
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/bc17469f13b84f4bae3f984d17b9e1df/ac62373c05284a888f850ceace1f2ae0.jpg
构造方法:
File File(String pathname): 根据 路径字符串 封装一个File对象
File File(String parent, String child): 根据 父路径字符串 和 子路径字符串 封装File对象
File File(File parent, String child): 根据 父路径的File对象 和 子路径 封装File对象
获取方法:
java.io.File类
// 常用获取方法
String getAbsolutePath()
: 返回此File的
绝对路径名字符串
String getPath():
获取File对象的
封装路径 (创建对象时传入的路径)
String getName():
获取File对象的
文件名或目录名 d:\a\b\c\aaa.txt
long length():
获取File表示的"文件"
大小的字节byte数 (不能获取目录的大小)
如果是目录返回:"0"或者"4096"
判断方法:(
常用
)
boolean exists():
判断File对象代表的文件或目录是否实际存在
boolean isDirectory()
: 判断File表示的是否为目录
boolean isFile():
判断File表示的是否为文件
创建删除方法:
java.io.File类
// 常用创建删除方法
boolean
createNewFile(): 当文件不存在时, 创建一个新的空文件
false: 路径已经存在(无论文件还是目录)
抛IO异常: 写的路径不符合逻辑 (Y:\\a.txt\dsfsd)
boolean
delete():
删除由此File表示的文件或目录.
删除目录时: 必须是空目录
boolean
mkdir(): 创建File表示的目录
"d:\\a\\b\\c\\我的目录"
false: 1. 路径已经存在(无论文件还是目录) 2. 写的路径不符合逻辑
boolean
mkdirs(): 创建File表示的
多级目录
"d:\\a\\b\\c\\我的目录"
false: 1. 路径已经存在(无论文件还是目录) 2. 写的路径不符合逻辑
遍历目录的方法:
java.io.File类
// 常用获取目录中内容的方法
[常用]
String[] list(): 获取当前File目录下的所有子文件或目录的名字数组
File[] listFiles(): 获取当前File目录中的所有子文件或目录的File对象数组
注意:
只能用表示目录的File对象调用
用文件的File对象, 或者路径不存在, 调用会报错
递归:
递归思想:
遇到一个问题时, 将该问题拆解成可以解决的小问题, 如果解决不了, 继续拆解为更小的问题. 如果小问题解决了, 大问题也就能够解决
Java中实现递归的方式:
方法内部调用方法自己 (所以必须定义方法)
递归的分类:
直接递归: 方法自己调用方法
间接递归: A方法调用B方法, B方法调用C方法, C方法调用A方法
递归时的注意事项:
1. 递归要有限定条件(出口), 保证递归能够停止(就是在某种情况下方法不再调用自己), 否则会栈内存溢出
2. 递归次数不能太多, 否则会栈内存溢出
3. 构造方法不能递归
递归的使用前提:
调用方法时, 方法的主体不变, 但每次传递的参数值不同, 可以使用递归
递归打印多级目录
分析:
大问题:
打印aaa目录中"所有"子文件和子目录的路径 =
打印aaa目录中子文件和子目录的路径 + (打印bbb子目录中"所有"子文件
和子目录的路径)?
打印bbb子目录中"所有"子文件和子目录的路径 =
打印bbb子文件和子目录的路径 + (打印ccc子目录中"所有"子文
件和子目录的路径)?
打印ccc子目录中"所有"子文件和子目录的路径 = 打印ccc
子文件的路径
要解决的问题(定义的方法): 打印(File 某个目录)中"所有"子文件和子目录
的路径
代码实现:
出口: 没有子目录的时候 (方法不再递归调用方法自己)
共性的公式: 打印某个目录子文件和子目录的路径 + 递归调用方法(打印
子目录中"所有"子文件和子目录的路径)?
File[] listFiles()
for(File file : arr) {
if (是文件) {
直接操作
} else {
是目录, 就递归调用方法
}
}
FileFilter文件过滤器的原理和使用
java.io.File类: Filter过滤器
File[] listFiles(FileFilter filter): 返回文件过滤器过滤后的File对象数组
File[] listFiles(FilenameFilter filter): 返回文件过滤器过滤后的File对象数组
java.io.FileFilter接口: 用于File对象的过滤器
boolean accept(File pathName): true则会将参数的File对象加入返回的File[], false则不
加入
java.io.FilenameFilter接口: 将File对象拆分为父路径和子路径来判断的过滤器
boolean accept(File dir, String name): true则会将参数的File对象加入返回的File[], false
则不加入
dir: 被找到的文件所在的目录 (父路径)
name: 文件的名称 (子路径)
使用FileFilter:
// 自定义 java文件过滤器
public
class
FileFilterImpl
implements
FileFilter
{
@Override
public
boolean
accept
(
File
pathname
) {
// 规则:
// 如果是目录, 允许添加到数组, 因为我们需要目录来递归调用
// 如果是文件, 则判断是否为java文件, 是则允许添加到数组中
// 判断是不是目录
if
(
pathname
.
isDirectory
()) {
// 允许添加到数组中
return
true
;
}
// 如果能执行到这里, 说明不是目录, 那肯定是文件, 则判断文件名后缀
boolean
isJavaFile
=
pathname
.
getName
().
toLowerCase
().
endsWith
(
".java"
);
return
isJavaFile
;
}
}
public
class
Test
{
public
static
void
main
(
String
[]
args
) {
File
dir
=
new
File
(
"day08"
);
printJavaFile
(
dir
);
}
public
static
void
printJavaFile
(
File
dir
) {
// 获取当前目录下的子文件和子文件夹, 传入过滤器对象
FileFilterImpl
fileFilter
=
new
FileFilterImpl
();
File
[]
childFiles
=
dir
.
listFiles
(
fileFilter
);
// 现在数组中只有.java文件和子目录
for
(
File
childFile
:
childFiles
) {
if
(
childFile
.
isFile
()) {
// 如果是文件, 那肯定是.java文件, 直接打印即可
System
.
out
.
println
(
childFile
);
}
else
{
// 如果是目录, 仍然是递归调用
printJavaFile
(
childFile
);
}
}
}
}
FilenameFilter文件过滤器的使用:
File[]
files1
=
file
.listFiles(
new
FilenameFilter
()
{
@Override
public boolean
accept(File
dir
, String
name
)
{
return
new
File(
dir
,
name
).isDirectory()
||
name
.toLowerCase().endsWith(
".java"
);
}
}
);
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2