今天Java学习内容:
一、File类
二、文件夹的遍历
三、递归
一、File类
理解:File类表示【文件】或者【文件夹/目录】
绝对路径和相对路径
绝对路径:从盘符开始的路径
举例:C:\abc\bbb\a.txt
相对路径:相对于项目的根目录,之后的路径
举例:项目的根目录为:C:\IdeaProject\job-java,项目中包含day08-code模块
“day08-code\abc\a.txt” 相当于拼接在 "C:\IdeaProject\job-java"之后
“day08-code\abc\a.txt” 等价于 “C:\IdeaProject\job-java\day08-code\abc\a.txt”
静态的常量
static String pathSeparator
路径分隔符,根据操作系统的不同而变化
Windows: “;” 分号
Linux: “:” 冒号
static String separator
名称分隔符,根据操作系统的不同而变化
Windows: “” 反斜线
Linux: “/” 正斜线
File构造方法
public File(String path)
根据路径创建File对象
public File(String parent,String child)
根据父路径和子路径创建File对象
public File(File parent,String child)
根据父路径和子路径创建File对象
【注意:创建File对象时候,必须指定路径(可以是存在的,也可以不存在; 可以绝对路径,也可是相对路径)】
File类的判断功能
boolean exists()
判断File对象的路径是否存在
boolean isDirectory()
判断File对象的路径是否问文件夹
如果路径不存在,返回false
boolean isFile()
判断File对象的路径是否问文件
如果路径不存在,返回false
boolean isHidden()
判断File对象表示的文件/文件夹是否隐藏
boolean canWrite()
判断文件是否可写(是否只读)
File创建和删除功能
boolean createNewFile()
创建File对象表示路径的文件
boolean mkdir()
创建File对象表示路径的文件夹(目录),单级文件夹
boolean mkdirs()
创建File对象表示路径的文件夹(目录),多级文件夹
boolean delete()
删除File对象表示的文件或者文件夹(必须是空文件夹)
File获取功能
String getName()
获取文件/目录的名称
File getAbsoluteFile()
获取绝对路径。返回File类型
String getAbsolutePath()
获取绝对路径。 返回String类型
String getPath()
获取File对象,封装的路径
String getParent()
获取File对象表示文件/文件夹的父路径
long length()
获取文件的大小(单位:字节)
注意:文件夹的大小不能用该方法
遍历功能
File[] listFiles()
获取一个文件夹里面的子文件/子目录。反回File[]
String[] list()
获取一个文件夹里面的子文件/子目录。返回String[]
二、文件夹的遍历
public static void main(String[] args){
printAllFile(new File("C:\\abc"));
}
//遍历文件夹所有的文件
public static void printAllFile(File dir){
//获取dir目录中所有的文件和文件夹
File[] files=dir.listFiles();
//遍历files数组
for(File f:files){
//判断f是否为文件
if(f.isFile()){
System.out.println(f);
}
//否则f就是文件夹
else{
printAllFile(f);
}
}
}
//文件过滤器
public static void getJavaFile(File dir){
//获取dir所有的.java文件
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isFile()) {
//如果文件名后缀为.java
if (pathname.getName().toLowerCase().endsWith(".java")) {
return true; //过滤通过
}else{
//不是.java的文件
return false;
}
} else {
//文件夹也过滤通过
return true;
}
}
});
//遍历files数组
for (File file : files) {
if(file.isFile()){
System.out.println(file);
}else{
getJavaFile(file);
}
}
}
三、递归
理解:方法自己调用自己
注意事项:
1)递归一定要有出口
2)递归的次数也不能过多
案例1:求1~n之间整数的和
/*
分析:f(n)表示1~n以内的和
f(1)=1
f(2)=f(1)+2
f(3)=f(2)+3
f(4)=f(3)+4
...
f(n)=f(n-1)+n
*/
public class Demo1{
public static void main(String[] args){
int result=sum(4);
System.out.println("4以内的整数和:"+result);
}
public static int sum(int n){
//如果n==1,结果就为1
if(n==1){
return 1;
}else{
return sum(n-1)+n;
}
}
}
案例2:求1~n之间整数的乘积(n的阶乘==>n!)
n!阶乘的原理(n=3)
/*
分析:f(n)表示1~n以内的乘积
f(1)=1
f(2)=f(1)*2
f(3)=f(2)*3
f(4)=f(3)*4
...
f(n)=f(n-1)*n
*/
public class Demo2{
public static void main(String[] args){
int result=cj(4);
System.out.println("4以内的整数乘积:"+result);
}
public static int cj(int n){
//如果n==1,结果就为1
if(n==1){
return 1;
}else{
return cj(n-1)*n;
}
}
}
案例3:求斐波那契数列第n个数是多少
1 1 2 3 5 8 13 21 …
找规律:
1)第1个数和第2个数,都是1
2)从第3个数开始,这个数前面两个数之和
/*
分析:假设f(n)表示斐波那契数列的第n个数、
f(1)=1
f(2)=1
f(3)=f(1)+f(2)
f(4)=f(2)+f(3)
...
f(n)=f(n-2)+f(n-1)
*/
public class Demo2{
public static void main(String[] args){
int result=getNum(4);
System.out.println("4以内的整数乘积:"+result);
}
//求斐波那契数列的第n个数
public static int getNum(int n){
if(n==1||n==2){
return 1;
}else{
return getNum(n-2)+getNum(n-1);
}
}
}
注意:
直接看路径看不出来是文件还是文件夹
得要看调用了是创建文件/文件夹方法
如果文件存在,再次创建就会覆盖原文件
fos.write(“helloWorld”.getBytes())
写数据到指定文件如果没有就创建该文件
读文件,如果没有之指定的文件就报错-FileNotFoundException
read()方法返回读取到的字节,如果没有数据可读或已经读到文件末尾就返回-1
只能读文件不能读文件夹否会拒绝访问
utf-8中一个汉字占3个字节
字母占2个字节
图片中的字节不能转换从字符串否则乱码
图片的编码方式和字符的编码方式不一样
读取文件乱码的原因:
不同的编码表对单个汉字的字节个数表示是不一样的-GBK(2个字节表示一个汉字),utf-8编码表(3个字节表示一个汉字)所以不同的编码格式读取不同的编码格式编译的文件就会出现乱码
close()与fluse()的区别
因为不同的编码表对单个中文的字节数规定不同,通过字节流读取文件中含有的中文容易产生乱码,所以要通过字符流来读取
Java学习第20天内容链接:
https://blog.csdn.net/LJN951118/article/details/89410013