A020_File

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};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常表示你正在尝试在不同的线程之间发送事件。在Qt中,UI元素(例如QLabel)通常与特定的线程相关联,并且只有在其所属的线程中才能接收和处理事件。 解决这个问题的一种常见方法是使用Qt的信号与槽机制,而不是直接发送事件。通过在不同线程之间使用信号与槽,可以确保事件在正确的线程中被处理。 以下是一个示例代码,展示了如何使用信号与槽来更新QLabel的文本: ```cpp #include <QApplication> #include <QLabel> #include <QThread> class WorkerThread : public QThread { Q_OBJECT signals: void resultReady(const QString& result); protected: void run() override { // 模拟耗时操作 sleep(5); // 发送信号通知结果 emit resultReady("操作完成"); } }; class MyWidget : public QLabel { Q_OBJECT public: MyWidget(QWidget* parent = nullptr) : QLabel(parent) {} public slots: void handleResult(const QString& result) { setText(result); } }; int main(int argc, char** argv) { QApplication app(argc, argv); MyWidget widget; widget.show(); WorkerThread thread; QObject::connect(&thread, SIGNAL(resultReady(const QString&)), &widget, SLOT(handleResult(const QString&))); thread.start(); return app.exec(); } ``` 在上面的示例中,我们创建了一个`WorkerThread`类,它是一个继承自`QThread`的自定义线程类。在`WorkerThread`中,我们在`run`函数中模拟了一个耗时操作,并通过`emit`关键字发送了一个带有结果的信号。 然后,我们创建了一个自定义的`MyWidget`类,它继承自`QLabel`,用于显示结果。我们在`MyWidget`中定义了一个槽函数`handleResult`,用于更新QLabel的文本。 在`main`函数中,我们创建了一个应用程序并显示了`MyWidget`。然后,我们连接了`WorkerThread`的结果信号与`MyWidget`的槽函数,以在结果可用时更新UI。 通过使用信号与槽机制,我们可以确保结果在正确的线程中处理,避免了跨线程发送事件的问题。请根据你的具体情况进行适当的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值