目录
1.内容介绍
1. 文件相关常识了解(了解)
2. File类学习(了解)
3. File类中的基本方法(掌握)
4.文件和文件名过滤器(掌握)
5.方法递归调用;(理解)树形结构的遍历(菜单和主菜单问题)
2.文件相关常识的了解
2.1.为什么需要认识文件
在计算机磁盘中,文件是一个非常重要的存在,大家知道我们数据都是保存在计算机磁盘,而磁盘以文件为载体,将信息存储在磁盘文件中,接下来我们学习的IO流也主要是对文件中的数据进行独写操作(存入磁盘或者从磁盘中拿出来),可以这么讲,计算机可以分为文件夹(文件夹也称之为目录)和文件两种东西,所以文件是一个非常重要的东西,我们需要学习了解,Java代码如何操作磁盘文件
2.2.什么是文件
从上面我们了解及IO流相关,计算机中非常重要的元素就是文件,那么什么是文件呢?下面我们看一下文件相关的常识。
1.文件 : 一般理解文件,例如文本文件 word文件 excel文件 压缩文件 图片 视频,java 文件…
2.文件夹\目录 : 用于装文件
3.文件夹用来干嘛:
主要是由于在一个文件夹下面不能够有两个名字一样的文件(A.txt a.txt 也是不能同时存在的)或者文件夹,所以文件夹主要目的分割不同区域,分别存储文件,避免文件名冲突
注意:文件后缀名:一般来说通过后缀名仅仅是判断文件类型,更改后缀名不会更改文件内容
4.不能够把数据直接写入文件夹,只能够写入文件
文件官方概念:计算机文件是以计算机硬盘为载体存储在计算机上的信息集合[二进制数据]
2.3.Java对于文件的支持
对于计算机磁盘的文件和目录,Java提供了对应的一个类File来描述
2.4.小结
3.File类的学习
3.1.File学些什么
思考:如果我们开发一款游戏软件,软件中一些错误的信息,我们可以内置一些代码,将错误信息保存到磁盘上面。那么我们可能需要做的事情,磁盘上创建文件或者文件夹等
1.File类,构造方法,方法等等需要我们学习了解
2.通过File类创建对象,创建文件,创建目录,需要掌握
3.2.File对象的创建
构造方法:
File(String pathname) pathname 文件的抽象路径名(文件的路径+文件名)
File(String parent, String child) parent + child 就是上面的pathname
File(File parent, String child)
三种方式都必须会,日常开发中第一个最常用
注意: 创建一个File对象并没有在磁盘上面创建一个文件(文件夹) 需要调用File中的特殊的方法。
3.3.创建一个具体的文件
boolean createNewFile()
1.需要File对象调用:根据File对象中的pathname来创建文件
2.如果文件已经存在,返回false
3.如果文件路径不存在,抛出IO异常
4.此方法只能够创建文件(传统理解的文件,不会创建文件夹)
3.4.创建文件夹
boolean mkdir()
1.需要File对象调用:根据File对象中的pathname来创建文件夹
2.如果文件夹已经存在,返回false
3.如果路径不存在,返回false,没有抛出异常
boolean mkdirs()
1.如果路径不存在,会自动先创建路径所需的文件夹
3.5.删除文件和目录
boolean delete()
1.需要File对象来调用(把File对象所关联的文件从磁盘上面删除)
2.如果是删除文件夹,必须是空文件夹
3.文件就直接删除
4.希望 : 有一个方法可以直接删除文件和文件夹(包括子文件夹和文件的)自己写一个
3.6.自定义删除文件的方法分析:
public static void deleteAll(File file){
/*如果:null 文件不存在: return;
*判断文件是否存在
* 如果文件
* 直接删除
* 如果为目录
* File[] arr = file.list();//得到的a中的文件及目录
* for(File fil : arr){
* deleteAll(fil);//独立的方法的使用
* //如果文件:直接删除
* //如果文件夹:
* //File[] ar2 = fil.list();
* //for
* }
* file.delete();
*
* */
}
3.7.小结
4.File类中的基本方法
4.1.判断系列方法
boolean isDirectory() 判断是否是一个目录
boolean isFile() 判断是否是一个文件
boolean exists() 测试此抽象路径名表示的文件或目录是否存在
.... 其它的请自行查找File的API文档
判断系列方法存在的意义
File f = new File("Hello.java");
f 指向的是文件还是目录? 不能够确定File类描述的包括文件和目录,应该调用上面的判断方法
为什么需要判断 : 对文件和目录的操作不一样!
1.需要把一些数据 “我就是数据我就是数据” 保存起来, 保存到文件而不是目录
2.需要得到一个目录下面的所有的File对象,应该是目录来调用
4.2.基本的list方法
static File[] listRoots() 列出可用的文件系统根(操作系统上面的盘符)
作用: 先判断电脑上有哪些盘符,然后在制定的位置创建文件夹或者文件
String[] list() 返回当前的文件夹对象下面一层的所有的文件(文件夹)的名字
File[] listFiles() 返回当前的文件夹对象下面一层的所有的文件(文件夹)(File对象的形式
4.3.小结
5.文件和文件名过滤器
5.1.什么是过滤器
过滤也等于是一种筛选,例如豆浆打好之后要过滤,我们去买菜,脑子里面我们要选好的菜,所以要过滤掉那些坏的菜,比如找女朋友…同学们有什么要求
5.2.自定义具有过滤效果的list方法
public static String[] myFileFilter(File file,String suffix){
String[] list = file.list();
ArrayList<String> arrayList = new ArrayList<>();
for (String string : list){
if(string.endsWith(suffix)){
arrayList.add(string);
}
}
return arrayList.toArray(new String[arrayList.size()]);
}
5.3.文件和文件名过滤器
File中提供了可以达到过滤效果的方法,我们可以在调用的时候指定具体的过滤器来得到我们想要的一个目录下面的东西。由于我们想要什么东西Java本身不知道的,所有它仅仅给我们提供了一个过滤器的接口(FilenameFilter, FileFilter)而已,需要我们自己自定义实现过滤器接口来定义过滤器类,具体的使用查阅File中的如下方法:
String[] list(FilenameFilter filter)
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter filter)
示例:
public class MyFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
//System.out.println(dir);
//System.out.println(name);
return name.endsWith("avi");
}
}
5.4.小结
6.方法递归调用
6.1.什么是递归
简单理解: 一般就是一个方法内部自己调自己
public static void main(String[] args) {
main(args);
}
Exception in thread "main" java.lang.StackOverflowError
at cn.itsource._08DiGui.TestDiGui.main(TestDiGui.java:21)
at cn.itsource._08DiGui.TestDiGui.main(TestDiGui.java:21)
at cn.itsource._08DiGui.TestDiGui.main(TestDiGui.java:21)
............
6.2.递归示例
方法的递归调用一定得有出口,不然只有死路一条,通过示例来理解它的真实的应用
public class TestDiGui {
/*
* 方法的递归调用
* 方法的内部,自己调用自己
*
* 通过一个斐波拉契数列,学习方法的递归调用
* f(0) = 0;
* f(1) = 1;
* f(n) = f(n-1) + f(n-2) n>=2;
*
* f(2) = f(1) + f(0) 1
* f(3) = f(2) + f(1) 2
* f(4) = f(3) + f(2) 3
* f(5) = f(4) + f(3) 5
*
* f(100)
* */
public static void main(String[] args) {
System.out.println(f(4));
}
public static int f(int n){
if(n==0||n==1){//99%
return n;
}else{
return f(n-1)+ f(n-2);//此处是在调用方法,不是在使用公式
}
}
}
6.3.方法递归调用的执行流程
6.4.小结
7.课程总结
7.1.重点
1、流概念及文件概念
2、过滤器概念的理解,会使用
3、API文档的使用一定要非常熟练了
4、File类中List及其它相关方法使用中的简单逻辑;
5、方法的递归调用
7.2.难点
1、方法的递归调用
8.常见面试题
1、递归和循环有什么区别?
9.课后练习[75分钟]
1、写一段代码完成一下功能:以课程根目录为准,找出其中的所有的视频文件,然后再一个新的路径下面创建对应的文件,暂时不考虑内容,只要有文件就行
例如:下面这样的效果,以Java2019039为根目录
完成后效果:
D://java基础视频
01集-01课程介绍
01集-02计算机相关知识
…
02集-01上集回顾
02集-02editplus使用
…
预习读写文件使用FileInputStream 把一个文件中的数据读取并打印到控制台; 使用FileOutputStream 把程序中的数据写入到一个文件中去
10.拓展
11.每日一练【15分钟】
1.请写出for循环的语法结构和执行流程
2.请说出以下数组,哪些是正确的,哪些是错误的
1)float[]=new float[3];
2)float f2[]=new float[];
3)float[] f1=new float[3];
4)boolean[] b={“true”,“false”,“true”};
5)double f4[]={1,3,5};