下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第19天 File类今日任务IO介绍File类(掌握)文件过滤器(掌握)递归技术(理解)课堂笔记IO介绍简单回顾之前所学的知识:字符串String:操作文本数据的;字符串缓冲区:容器,可以存储很多的任意类型的数据,最后都变成字符串;基本数据类型包装类:解决了字符串和基本数据类型之间的转换,同时给基本数据类型提供更多的操作;集合框架:对象多了,便于存储后操作;Date ,DateFormat,SimpleDateFormat、Calendar:解决日期和时间的问题;在前期的学习上述知识点的过程中,我们书写的任何程序,它运行的时候都会有数据的产生,比如时间数据,而这些数据最终都保存在内存中。程序运
2、行结束之后,数据就没有了。当程序下次启动的时候,如果还需要使用上次的结果,这时程序中是没有的。而在开发中,在我们真正书写的程序中,往往有一些数据是需要长久保存起来的,当程序中需要这些长久保存起来的数据的时候,再从其他的地方读取到程序中。也就是说我们以前学习的数据都是存储到内存中,而内存中只能暂时存储数据,当电脑关闭之后,数据就不见了。如果在开发中需要大量数据被长久保存,下次开电脑这些数据仍然还在,那么我们肯定不能保存到内存中,我们需要保存在能够保存持久数据的地方或者叫持久设备。那么问题来了:什么是持久设备呢?1.1什么是持久设备持久设备:可以持久保存数据的设备。硬盘、U盘、光盘、网盘、软盘等。
3、这些设备都可以长久的保存数据。那么还有一个问题:如何把程序中的数据保存到持久设备中?Java提供了一个技术,专门来实现数据与持久设备间的交互:IO技术。通过IO技术就可以达到程序和其他设备之间的数据交互。1.2什么是IO技术IO技术:它主要的功能就是把我们程序中的数据可以保存到程序以外的其他持久设备中(如:我们电脑的硬盘),或者从其他持久设备中(如:我们电脑的硬盘)进行读取数据,把数据读取到我们的Java程序中。IO:I:Input:输入或者读取,从持久设备(硬盘)的数据放到内存中;O:Output:输出或者写出,从内存中的数据放到持久设备(硬盘)上;也可以按照如下理解:把从持久设备(硬盘)上
4、读取(输入)到内存中的动作,称为读操作。 I:input。把内存中的数据输出(写出)到持久设备(硬盘)的动作,称为写操作。O:output。读写操作图解如下所示:说明:1)我们的程序运行在内存中,因此我们的输入和写出都是相对内存而言; 2)Java程序必须运行在Java虚拟机上,Java程序最终需要JVM来执行; 3)JVM属于应用软件需要安装在操作系统软件上,所以JVM虚拟机是运行在操作系统之上的,然后由操作系统和计算机硬件进行交互;2、File类2.1、File类介绍数据最终保存在硬盘上,在硬盘上是以1和0 保存的。而给我们展示出来的并不是二进制数据,而是一个一个的文件,换句话说数据最终都
5、保存在这些文件中。而这些文件又被文件夹管理。 通过上述描述我们发现在计算机硬盘中就存在两种事物:文件和文件夹事物。而在Java中使用class类来描述生活中存在的事物,那么Java中是如何描述文件和文件夹这两类事物呢?使用File类来描述文件和文件夹事物。说明:1)Java中的定义的io技术的类基本都在java.io包下; 2)使用File类来描述文件和文件夹事物的; 3)File类它主要是对持久设备上的文件和文件夹进行操作。它不能去操作文件中的数据。将来我们只要需要操作持久设备上的文件或文件夹直接找File类完成,如果要操作文件中的数据只能找后面学习的IO技术搞定;结论:File类就是描述文
6、件或文件夹的,只要我们在Java中要操作文件或文件夹,就找File类。2.2、File类构造方法1)public File(String pathname) 表示根据文件或文件夹的路径名创建一个File对象。使用File类的构造函数可以把指定的字符串封装成File类的对象,但是这个字符串表示的路径或者文件到底是否存在,File类是不进行判断的。注意:File类表示文件和目录路径名的抽象表示形式。那么该路径代表的文件或文件夹不一定存在。需求:创建一个File类的对象,表示:D:abc1.txt2)public File(String parent,String child) 根据父目录的路径名和
7、儿子的名称创建一个File对象。 需求:创建一个File类的对象,表示:D:abc1.txtpublic File(File parent,String child) 根据父目录的File对象和儿子的名称创建一个File对象。就是把已经存在的File对象和某个子目录合并成一个新的File对象。分析和步骤:A:创建一个File类的对象parent,D:abc作为参数;B:定义一个字符串child=1.txt;C:使用上述构造函数在重新创建一个File类的对象file,并输出打印;2.3、获取方法File类是描述文件和文件夹的。使用File类的对象就可以获取当前File类描述的那个文件或文件夹的信
8、息(信息包括文件或者文件夹的名称、大小、类型、日期等)。案例:File类中的获取方法。A:getAbsolutePath() 获取的当前调用这个方法的File对象的全路径(绝对路径或者真实路径) 返回的是路径的字符串;B:getAbsoluteFile()获取的当前调用这个方法的File对象的全路径(绝对路径或者真实路径) 返回的是路径封装成的新的File;说明:在操作文件时,需要指定文件的路径,而路径在程序中有两种表现形式:绝对路径:是从盘符开始的路径,带有根目录的路径 例: D:abctestDemo.java D就是根目录。相对路径:是从当前路径开始的路径,或者可以理解不带根目录的路径
9、例: 当前路径为D:abc,要描述相对路径,只需输入testDemo.java实际上,严格的 HYPERLINK /s?wd=%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YvPW6duyDYnjuWm16krj-b0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHfvnWD3PWR t /question/_blank 相对
10、路径写法应为: .testDemo.java其中,. 表示当前路径。 C:getName() 获取的是File类的对象中封装的文件或目录的最后一级名称; D:getParentFile() 获取到的是File类的对象的父目录,把父目录封装成一个新的File对象; E:getParent() 获取到File类的对象的父目录,把返回目录的字符串表示形式; F:getPath() 获取到当前File类的对象中封装的内容; G:getFreeSpace() 获取某个盘的剩余空间; H:getTotalSpace() 获取某个盘的总空间; I:public static HYPERLINK mk:MSI
11、TStore:F:itcast开发资料基础班APIJDK_API_1_6_zh_CN.CHM:/java/io/././java/io/File.html o java.io 中的类 File listRoots() 获取系统的所有根目录,例如:C盘、D盘、E盘、F盘; 说明:由于该函数是静态的,直接使用类名调用即可。获取函数代码演示如下所示:package cn.itcast.sh.file.constructor.demo;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;/* * Fil
12、e类中的获取方法演示 * 绝对路径:带根路径 * 相对路径:不带根路径 testhaha表示相对路径,这里表示相对于项目day19a来说 */public class FileGetFunctionDemo public static void main(String args) / 创建File类的对象File file=new File(D:test123.txt);/getAbsolutePath()获取绝对路径演示 返回的是路径的字符串 D:test123.txt /如果File file=new File(); 参数不指定路径,则输出当前项目的路径F:newEclipseWorksp
13、acebeikeday19aString absolutePath = file.getAbsolutePath();System.out.println(absolutePath=+absolutePath);/getAbsoluteFile()获取绝对路径演示 返回的是路径新封装的File类的对象 D:test123.txt /如果File file=new File(); 参数不指定路径,则输出当前项目的路径F:newEclipseWorkspacebeikeday19aFile absoluteFile = file.getAbsoluteFile();System.out.print
14、ln(absoluteFile=+absoluteFile);/getName()函数 获取的是封装在File类中的文件或者文件夹的最后一级名称 123.txtSystem.out.println(getName()=+file.getName();/getParentFile()函数演示 获得File类中的文件或者文件夹的路径的父目录 封装在在一个File类中D:testSystem.out.println(getParentFile()=+file.getParentFile();/getParent()函数演示 获得File类中的文件或者文件夹的路径的父目录 封装在String类中 D:
15、testSystem.out.println(getParent()=+file.getParent();/getPath()表示获得File类中封装的所有内容 D:test123.txt /如果File file=new File(); 参数不指定路径,则输出”空字符串System.out.println(getPath()=+file.getPath();/getFreeSpace() 函数 /如果File file=new File(D:); D盘剩余空间是:366774648832System.out.println(剩余空间是+file.getFreeSpace();/getTota
16、lSpace() 函数 /如果File file=new File(D:); D盘总空间是:371056439296System.out.println(总空间是+file.getTotalSpace();System.out.println(-);/调用listRoots()函数获取系统的根目录 由于该函数是静态的,直接使用类名调用即可 / 输出结果C: D: E: F: G: H: File dirs = File.listRoots();for (File dir : dirs) System.out.print(dir+” ”); J:public long lastModified(
17、) 获取上一次修改的时间,返回的是毫秒值;演示lastModified函数:分析和步骤:创建File类的对象file2,D:test123.txt作为构造函数的参数;使用对象file2调用lastModified()函数获得上次更改D盘下的1.txt文件的时间time;使用Date()构造函数将time转换成Date时间类的对象d;创建SimpleDateFormat类的对象sdf,时间格式是:yyyy-MM-dd HH:mm:ss;使用格式化解析器对象sdf调用format函数将日期时间对象d转换为字符串sTime,并输出;获取函数代码演示如下所示:2.4、创建方法由于File类既可以表示文
18、件,也可以表示文件夹(目录)。Java针对File类的创建方法给出2类,一类是创建文件的方法,一类是创建文件夹的方法。1、创建文件可以创建一个文件,返回的boolean值表示文件是否创建成功。true :表示创建文件成功; false :表示创建文件失败,失败原因基本是因为当前的目录有了相同的文件;需求:创建:D:abc1.txt文件。在D盘的abc文件夹下新创建一个1.txt文件。分析和步骤:创建File类的对象file,指定目录和文件名;使用file对象调用createNewFile()函数创建文件,并打印返回值;说明:createNewFile()函数表示 把封装的File类的对象创建成
19、一个文件,如果指定的路径没有创建的文件,则会创建文件,返回值是true,创建成功;如果同名的文件已经存在,则不会再创建文件,返回false,创建失败;如果指定的路径不存在,这时就会抛异常 Java.io.IOException:系统找不到指定的路径。这时是不会去创建文件的; 2)只要使用createNewFile()函数创建出来的一定是文件,不管有没有扩展名。如果指定的文件没有扩展名,那么也会创建没有扩展名的文件;补充:在计算机中,一个文件是可以没有扩展名的。 3)创建File类的对象时,如果找不到创建文件的路径就会报上述异常:Java.io.IOException;2、创建文件夹mkdir(
20、) 函数表示创建单级目录。如果创建文件夹中存在要创建的文件夹,则返回false,创建失败, 如果创建超过一个目录,也会返回false。前提是这个多级目录在计算机上都没有存在。如果是多级目录,但是多级目录除了最后一个目录,前面目录都存在,那么也会返回true,创建成功。 mkdirs() 函数表示一次创建多级目录。创建单级目录也可以,如果创建文件夹中存在此文件夹, 则返回false,创建失败。需求:创建一个多目录文件夹D:aaabbbccc分析和步骤:1)创建File类的对象file,指定创建的目录;2)使用file对象分别调用mkdir() 和mkdirs() 函数创建文件夹,并打印返回值;需
21、求:使用mkdirs()函数创建一个D:abc1.jpg 的文件夹。注意: 1):创建文件或文件夹时,一定要调用正确的方法。 骑着白马的不一定是王子,也有可能是唐僧; 长着翅膀的不一定是天使,也有可能是鸟人; 名字叫.jpg的不一定是文件,也有可能是文件夹;举例:new File(“D:abc1.jpg”);A:如果使用File类的对象创建文件夹,那么在硬盘上就会生成一个文件夹。名字为1.jpg.而此时如果在使用createNewFile()在创建1.jpg文件,也不会创建成功;B:注意啦 如果创建文件夹的时候,当前目录中存在一个文件的全名(文件名+后缀名)和要创建文件夹同名,那么也不会创建该
22、文件夹;举例:比如我要创建:结果在D:abc文件夹下面有一个文件的名字叫做:。此时不会创建成功。 2):绝对路径和相对路径创建文件或者文件夹的问题。 绝对路径:有根目录的路径 相对路径:没有根目录的路径 我们创建一个文件或文件夹时,如果使用了相对路径,会在项目目录下创建。2.5、删除方法boolean delete() 删除File类对象中的文件或文件夹。 注意: 1)delete()函数的删除不走回收站。谨慎使用。 2)delete()函数可以删除文件或者文件夹,但是删除文件夹的时候,要求文件夹一定是空的。也就是说如果一个文件夹中有儿子,那么不能直接删除该文件夹。2.6、判断方法File类既
23、可以描述文件,也可以描述文件夹。那么File类中就给出了判断当前File对象封装的对象到底是文件还是文件夹。public boolean isDirectory() 是否是文件夹 如果是文件夹 返回 true 否则返回false;public boolean isFile() 是否是文件 如果是文件 返回 true , 否则返回false;public boolean isHidden() 是否隐藏 如果是隐藏文件或者文件夹 返回 true , 否则返回false;public boolean exists() 是否存在 如果File类对象中的文件或者文件夹在硬盘上存在 返回 true ,否则
24、返回false;代码演示如下所示:2.7、列举方法有时我们需要获取指定目录下的文件或文件夹。所以我们可以采用以下方法来获取。list()它是获取指定目录(文件夹)下的所有文件或文件夹,把这些文件或文件夹的名字保存在返回的字符串数组中。可以理解为获取当前目录下的所有儿子的名称的数组。需求:扫描D:test下的所有子文件和子文件夹,并且打印子文件或者子文件夹名。分析和步骤: 1):创建父目录D:test的File对象dir; 2):使用dir对象调用list()函数获取所有儿子的数组,数组名叫做dirs; 3):使用foreach循环遍历dirs,打印数组中存放的文件或者文件夹名;/需求:扫描D:
25、test下的所有子文件和子文件夹,并且打印子文件或者子文件夹名。public static void method_1() / 创建File类的对象File file = new File(D:test);/使用file对象调用list()函数所有的儿子文件或者文件夹String dirs = file.list();/循环遍历数组for (String dir : dirs) System.out.println(dir);上述函数虽然可以获得文件或者文件夹名字,但是都变成字符串了,在开发中用处不是太大,我们更希望获得的是文件或者文件夹的对象,这样操作会更广泛。listFiles()它也是获
26、取指定目录下的文件和文件夹,但把这些文件和文件夹的名字重新封装成一个一个独立的File对象,把这些File对象保存在File数组中,最后返回这个File数组。也可以理解为获取当前目录下的所有儿子File对象的数组。需求:扫描D:test下的所有子文件和子文件夹,打印出哪些是文件夹哪些是文件。分析和步骤:1):创建父目录D:test的File对象dir; 2):使用dir对象调用listFiles()函数获取所有儿子的对象数组,数组名叫做files;:使用foreach循环遍历files,获取每个文件或者文件夹的对象file;4):使用file对象调用isDirectory()判断此时file对
27、象是否是文件夹,如果是,则打印文件夹,否则说明是文件,打印文件;/需求:扫描D:test下的所有子文件和子文件夹,打印出哪些是文件夹哪些是文件。public static void method_2() / 创建File类的对象File file = new File(D:test);/根据file对象调用listFiles()函数获得上述文件夹中的所有儿子文件和文件夹File dirs = file.listFiles();/遍历数组获得File类的对象for (File dir : dirs) /* * 如果想输出哪些是文件夹哪些是文件,由于File类中要么是文件要么是文件夹 * 所以我们
28、可以先获得文件夹,然后打印,则另一个就是文件 * dir.isDirectory() 如果为true,说明是文件夹 * dir.getName()表示获得文件或者文件夹的名字 */if(dir.isDirectory()/说明是文件夹System.out.println(dir.getName()+是文件夹);else/说明是文件System.out.println(dir.getName()+是文件);说明:如果想输出哪些是文件夹哪些是文件,由于File类中要么是文件要么是文件夹。所以我们可以先获得文件夹,然后打印,则另一个就是文件。dir.isDirectory() 如果为true,说明是
29、文件夹;dir.getName() 表示获得文件或者文件夹的名字;3、文件过滤器(难)3.1、文件过滤器介绍过滤器:它就是把不需要的过滤出去,留下需要的内容。文件或文件夹过滤器:过滤掉不需要的文件或文件夹,留下需要的文件或文件夹。有种需求可以考虑使用过滤器:假设在一个父目录文件夹下有成千上万个文件或者文件夹,而后缀名为.jpg的文件只有几个,我想把后缀名为.jpg的文件找出来,其实使用我们刚才讲解的list()和listFiles()函数可以解决,但是比较麻烦,主要是麻烦在某个类中或者某个项目中写完之后想要在其他项目使用,还得书写,也就是可移植性不是太好,那么我们是否可以想出一个可移植性好的办
30、法呢,写完一次,其他地方可以再用,提高效率简化代码开发。答案是可以的,过滤器就可以实现。3.2、FilenameFilter接口(文件名过滤器)accept:方法是用来书写具体过滤的条件的。dir参数:是当前name所表示的文件或文件夹所在的父目录。name参数:是需要过滤的那个文件夹的名字或者文件的整体名字(包括文件的后缀名,例如123.java 或者mm.jpg)。举例:想过滤 D:test123.java 下面的123.Java文件,如果想使用这个accept(dir,name)函数,那么dir 表示D:test,而name表示123.java。注意:这个接口没有实现类,如果我们想使用这
31、个接口中的函数,我们需要自己定义实现类并复写accept()函数。File类中的函数:public String list(FilenameFilter filter) 返回符合过滤器中条件的儿子的名称的字符串数组public File listFiles(FilenameFilter filter) 返回符合过滤器中条件的儿子的File对象数组需求:判断D:test下是否有.jpg文件,如果有,则打印其绝对路径。分析和步骤:创建测试类FilenameFilterDemo;在FilenameFilterDemo类中main函数中创建父目录File类的对象parent,D:test作为函数的参数
32、;使用对象parent调用list()函数获取所有符合条件的儿子的名称数组names,自定义过滤器类的对象new MyFilenameFilter()作为参数;循环遍历数组names,获取每个儿子;创建File类的对象重新封装儿子的对象file;使用file对象调用getAbsolutePath()函数获得D:test文件夹下含有文件.jpg的绝对路径,输出并打印;7)上述方案也可以换另一种方式实现,父目录对象可以调用listFiles()函数来获得符合过滤器中条件的儿子的File对象数组;使用public String list(FilenameFilter filter) 函数方式来实现过
33、滤功能。测试类代码如下:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * FilenameFilter过滤器的演示 * 需求:判断D:test下是否有.jpg文件,如果有,则打印其绝对路径。 */public class FileNameFilterDemo public static void main(String args) method_1();/public String list(FilenameFilter filter) 返回符合过滤器中条件的儿子的名称的字符串数组public static void
34、method_1() / 创建File类的对象File file = new File(D:test);/* * 使用file对象调用list(FilenameFilter filter) 函数来筛选D:test * 目录下儿子文件后缀名是.jpg */获得符合条件的儿子的名字的数组String names = file.list(new MyFilenameFilter();/遍历数组for (String name : names) /* * 这里的name就是表示D:test目录下符合条件的儿子的名字 * 也就是说name在这里就是所有后缀名为.jpg的文件名字 * 如D:test目录下
35、的1.jpg文件 * 由于题目需求是想获得儿子文件的绝对路径 * 想获得绝对路径必须得调用File类中的getAbsolutePath()函数 * 而这个函数是非静态函数得通过File的对象调用 * 所以接下来我们要获得File类的对象 */使用File类的构造函数封装儿子的对象 file2代表后缀名是.jpg的文件的对象File file2 = new File(file,name);System.out.println(file2.getAbsolutePath();过滤器类代码实现:说明:对FilenameFilter接口中的accept函数进行进一步说明:这个方法中定义过滤条件,当我们
36、调用list或者listFiles方法的时候,会把每个儿子都拿来调用accept方法: 如果这个方法返回true,那么这个儿子会被添加到最终的数组中; 如果这个方法返回false,那么这个儿子就不会被添加到最终的数组;创建一个过滤器类MyFilenameFilter 并实现FilenameFilter接口,然后复写接口中的accept()函数;在accept函数定义过滤条件来判断每个儿子是否符合要求,符合就返回true,否则返回false;创建File类的对象封装儿子的对象file;定义一个boolean类型的变量flag来接收name的后缀名是否是.jpg,并且必须是文件的布尔值;返回fla
37、g的值;package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FilenameFilter;/* * 过滤名字的过滤器 */public class MyFilenameFilter implements FilenameFilterpublic boolean accept(File dir, String name) /* * 我们需要在这里书写过滤条件,判断儿子是否符合条件 * 符合,则返回true * 不符合,则返回false * dir表示父目录 * name 表示儿子(文件或者文件夹)的名字
38、 例如 1.jpg */输出dir 和 name /System.out.println(dir+-+name);/* * 这里的儿子名字name都是String类型,而我们又想获取name的后缀名是.jpg * 所以也就是说我们需要判断字符串name的后面是否是.jpg, * 如果是就返回true,存储到数组中,否则不存储 */判断name的后缀名是否是.jpgboolean boo = name.endsWith(.jpg);/* * 还得判断儿子是否是文件 但是这里的name是字符串不能调用isFile()函数 * 所以只能将儿子的名字name封装成File类的对象 */File fil
39、e = new File(dir,name);/判断儿子是否是文件 true 是文件 false不是文件boolean boo2 = file.isFile();return boo & boo2;使用public File listFiles(FilenameFilter filter) 函数方式来实现过滤功能。测试类代码如下:/public File listFiles(FilenameFilter filter) 返回符合过滤器中条件的儿子的File对象数组public static void method_2() / 创建File类的对象File file = new File(D:t
40、est);/* * 使用file对象调用list(FilenameFilter filter) 函数来筛选D:test * 目录下儿子文件后缀名是.jpg */获得符合条件的儿子的名字的数组File files = file.listFiles(new MyFilenameFilter();/遍历数组for (File file2 : files) /* * 这里的file2就是表示D:test目录下符合条件的儿子的对象 * 也就是说file2在这里就是所有后缀名为.jpg的文件的对象 * 如D:test目录下的1.jpg文件 * 由于题目需求是想获得儿子文件的绝对路径 * 想获得绝对路径必须
41、得调用File类中的getAbsolutePath()函数 * 而这个函数是非静态函数得通过File的对象调用 * 所以这里直接使用file2调用即可 */System.out.println(file2.getAbsolutePath();过滤器源码实现来说明FilenameFilter过滤器中accept()函数执行的时间:说明:FilenameFilter:过滤器仅仅只能根据accept方法中name中包括的字符内容过滤当前的文件或文件夹。而不能直接去判断当前以name表示的那个字符串到底是文件还是文件夹,只能间接的重新封装name对象,然后根据封装后的对象调用isFile()函数判断是
42、否是文件,虽然这样可以解决问题,但是不建议开发中使用上述这种方式。Java中又给我们提供了一个比较简单的实现方式就是过滤器FileFilter。3.3、FileFileter介绍FileFilter:它也是一个过滤器,专门用来过滤文件或文件夹的。File类中的函数:File listFiles(FileFilter filter) 返回符合过滤器条件的所有儿子的File数组FileFilter过滤器中的accept方法中的pathname是当前需要过滤的那个文件或文件夹对象。或者可以这么理解pathname:就是某个儿子的File对象。这里的File pathname参数相当于:Filenam
43、eFilter过滤器中的自定义过滤器类MyFilenameFilter里面的代码: File file=new File(dir,name);需求:判断D:test下是否有.jpg文件,如果有,则打印其绝对路径。分析和步骤:1)创建测试类FilenameFilterDemo1;2)在FilenameFilterDemo1类中main函数中创建父目录File类的对象parent,D:test作为函数的参数;3)使用对象parent调用listFiles()函数获取所有符合条件的儿子的File数组files,自定义过滤器类的对象new MyFilenameFilter()作为参数;4)循环遍历数组
44、files,获取每个儿子file;5)使用file对象调用getAbsolutePath()函数获得D:test文件夹下含有文件.jpg的绝对路径,输出并打印;测试类代码:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * 演示文件过滤器 FileFilter * 需求:判断D:test下是否有.jpg文件,如果有,则打印其绝对路径。 */public class FileFilterDemo public static void main(String args) / 创建父目录D:test的对象File file =
45、 new File(D:test);/* * 使用父目录对象file调用listFiles(FileFilter filter) * 获得符合符合过滤器条件的儿子对象 */File files = file.listFiles(new MyFileFilter();/遍历儿子对象的数组 file2表示符合条件的儿子对象for (File file2 : files) /输出绝对路径System.out.println(file2.getAbsolutePath();过滤器类代码实现:说明:对FileFilter接口中的accept函数进行进一步说明:这个方法中定义过滤条件,当我们调用listF
46、iles方法的时候,会把每个儿子都拿来调用accept方法: 如果这个方法返回true,那么这个儿子会被添加到最终的数组中 如果这个方法返回false,那么这个儿子就不会被添加到最终的数组1)创建一个过滤器类MyFileFilter 并实现FileFilter接口,然后复写接口中的accept()函数;2)在accept函数定义过滤条件来判断每个儿子是否符合要求,符合就返回true,否则返回false;3)使用File类的对象pathname调用getName()然后调用String类中的endsWith()函数判断文件名的后缀名是否是.jpg;4)使用File类的对象pathname函数调用
47、isFile()判断是否是文件;5)使用return关键字将上述两个布尔类型的值返回;package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FileFilter;/* * 自定义文件过滤器 */public class MyFileFilter implements FileFilter public boolean accept(File pathname) /* * 这里的pathname表示儿子的File类的对象 * 这里的pathname就相当于FilenameFilter过滤器中的 * new
48、 File(dir,name); */System.out.println(=+pathname);/* * 儿子对象有了,我们可以调用函数判断儿子是否是文件 */boolean boo = pathname.isFile();/* * 接下来我们要判断儿子属于文件,文件的后缀名是否是.jpg * 那么我们要获得儿子的名字 getName()函数可以实现 */String name = pathname.getName();/判断字符串name的后缀名是否是.jpgboolean boo2 = name.endsWith(.jpg);return boo & boo2;升级一下需求:获取D:t
49、est下的所有任意指定类型的文件,打印绝对路径分析:原来:我们把判断条件写死成.jpg,所以只能判断扫描.jpg文件。现在:我们要判断任意类型的文件,那么就不能写死。用户让我们过滤什么,我们就过滤什么。说明:对于这里的程序来说,用户就是使用过滤器的地方,就是创建过滤器类对象的地方。 那么,过滤的条件需要让用户传递给过滤器。 用户调用过滤器的时候,仅仅是创造了过滤器类的构造函数,所以,我们考虑用构造函数传递参数。过滤器类的代码如下所示:package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FileFilt
50、er;/* * 自定义文件过滤器 */public class MyFileFilter implements FileFilter /定义一个成员变量 代表后缀名public String suffix;/定义构造函数 接收调用传递过来的文件后缀名public MyFileFilter(String suffix)this.suffix=suffix;public boolean accept(File pathname) /* * 这里的pathname表示儿子的File类的对象 * 这里的pathname就相当于FilenameFilter过滤器中的 * new File(dir,nam
51、e); */System.out.println(=+pathname);/* * 儿子对象有了,我们可以调用函数判断儿子是否是文件 */boolean boo = pathname.isFile();/* * 接下来我们要判断儿子属于文件,文件的后缀名是否是.jpg * 那么我们要获得儿子的名字 getName()函数可以实现 */String name = pathname.getName();/判断字符串name的后缀名是否是.jpg/boolean boo2 = name.endsWith(.jpg);/判断字符串name的后缀名是否是suffix 这里的suffix由调用者决定boo
52、lean boo2 = name.endsWith(suffix);return boo & boo2;测试类的代码如下所示:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * 演示文件过滤器 FileFilter * 需求:判断D:test下是否有.jpg文件,如果有,则打印其绝对路径。 */public class FileFilterDemo public static void main(String args) / 创建父目录D:test的对象File file = new File(D:test);/* *
53、使用父目录对象file调用listFiles(FileFilter filter) * 获得符合过滤器条件的儿子对象 * 想要的文件类型由调用者决定 .txt */File files = file.listFiles(new MyFileFilter(.txt);/遍历儿子对象的数组 file2表示符合条件的儿子对象for (File file2 : files) /输出绝对路径System.out.println(file2.getAbsolutePath();上述两个过滤器类的图解说明如下所示:递归技术需求:扫描D:test所有子文件及子子文件下的.jpg文件。我们如果用循环来做这件事,
54、我们不知道循环的结束条件,也不知道到底有多少层,所以比较麻烦。我们可以用一种新的思想:递归。递归举例:从前有一座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:从前有一座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:从前有一座山,山里有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:。故事如何才能结束:小和尚还俗了。庙塌了。山崩了。Java中的递归:在方法的函数体中又调用了方法自己本身。递归调用的细节:必须要求递归中有可以让函数调用的结束条件。否则函数一直调用,就会导致内存溢出。4.1递归演示练习1:需求:计算15的和值,不许使用循环。分析和步骤:定义一个DiGuiDemo测试
55、类;在这个类中的main函数中调用自定义函数,5作为函数的参数,使用一个变量sum来接收返回的和值,并输出和值sum;自定义add()函数接收传递的参数5;在自定义函数中书写if语句判断i是否大于1,如果大于1,则使用return返回i+add(i-1);否则i1)/这里的add函数调用了函数自己本身的做法就是函数得递归调用return n+add(n-1);/返回1作为递归的结束条件return 1;上述代码图解如下图所示:练习2:需求:求5的阶乘!分析:普及一下数学知识: 方式1:5! = 5 * 4 * 3 * 2 * 1 = 120; 方式1 循环方式:代码如下所示:步骤:1)定义一个
56、DiGuiDemo2测试类;2)在这个类中的main函数中调用自定义函数jc(),5作为函数的参数,使用一个变量result来接收返回的阶乘的值,并输出结果result;3)自定义jc()函数接收传递的参数5;4)在自定义函数中定义一个变量result=1,使用for循环来实现方式1求阶乘的结果,并返回result阶乘的值;package cn.itcast.sh.digui.demo;/* * 练习2:需求:求5的阶乘! * 方式1:5!=5*4*3*2*1=120 */public class DiGuiDemo2 public static void main(String args)
57、int result=jc(5);/输出阶乘后的结果System.out.println(result);/120/使用方式一来求5的阶乘public static int jc(int n) /定义 一个变量来接收阶乘后的结果int result =1;for (int i = 2; i = n; i+) result=result*i;return result;方式2:使用递归思想来完成5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1*0!找规律:n! = n * (n-1)!补充:0!等于1结束条件:if(n 1时,使用ret
58、urn返回n * jc2(n - 1);package cn.itcast.sh.digui.demo;/* * 方式2:使用递归思想来解决5的阶乘 *方式一: 5!=5*4*3*2*1; *方式二:5!=5*4! * 4!=4*3! * 3!=3*2! * 2!=2*1! *1!=1*0! *找规律:n!=n*(n-1)! *找结束条件: *if(n=1) return 1; */public class DiGuiDemo3 public static void main(String args) / 调用函数求5的阶乘int result=jc2(5);System.out.printl
59、n(result);/120/自定义函数求5的阶乘public static int jc2(int n) / 结束条件if(n=1)return 1;return n*jc2(n-1);上述代码内存图解如下所示:4.2递归注意事项递归必须有结束条件,否则栈内存会溢出,称为死递归!栈炸了。栈内存溢出报的异常如下所示:递归次数不能太多,否则栈溢出。炸了栈内存溢出报的异常如下所示:3)构造函数不能递归,内存溢出,编译直接报错。总结:递归容器容易导致内存溢出。即使递归调用中有结束条件,但是如果递归的次数太多,也会发生内存溢出。所以在开发中使用函数的递归调用时需谨慎。4.3递归练习斐波那契数列或者叫做
60、黄金分割数列或者叫做兔子数列:不死神兔问题:有1对兔子,从出生的第3个月开始,每个月都生1对兔子,假如兔子都不死,问第n个月有几对兔子。斐波那契数列思想的图解如下图所示:斐波那契数列思想如下所示:找规律: 月份(n): 12345678910 .兔子对数(f): 11235813213455 . f(n) = f(n-1) + f(n-2)找出口:if(n = 2) return 1;代码实现如下所示:分析和步骤:定义一个测试类DiguiDemo4 ;在DiguiDemo4类中调用自定义函数countRabbits(),指定月份作为参数,就是想看第几个月有多少对兔子,使用一个整数变量接收返回来
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年四川水利职业技术学院单招职业适应性考试备考试题及答案解析
- 2026年张家口职业技术学院单招职业适应性考试备考题库及答案解析
- 2026年武汉城市职业学院单招职业适应性测试备考试题及答案解析
- 2026年黑龙江农垦科技职业学院单招职业适应性测试备考题库及答案解析
- 2026年江西农业工程职业学院单招职业适应性测试备考试题及答案解析
- 2026年重庆三峡职业学院单招职业适应性测试参考题库及答案解析
- 期中考试的检讨书15篇
- 2026年衡水职业技术学院单招职业适应性测试备考题库及答案解析
- 铸造实习工作总结
- 2026年广西经济职业学院单招职业适应性考试模拟试题及答案解析
- HPV感染预防措施指导
- 中国银发经济市场与投资赛道66条(2025)(精要版)
- 卫生器材与装备操作使用试题和答案
- 2025-2026学年湖南省永州市高三上学期一模化学试题及答案
- 2025年国家开放大学《管理心理学》期末考试备考题库及答案解析
- 抹墙加固高延性混凝土施工方案
- 2025年内蒙古行政执法人员执法证考试题库及答案
- 护理人员为军服务
- 乡村景观重构概述
- 压铸机安全培训试题及答案解析
- 2025合同终止协议示范文本格式
评论
0/150
提交评论