Java学习_Day19

今天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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值