递归算法
递归 : 递进回归
代码中的体现: 方法内部调用方法本身
生活中的案例:
从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事...
从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事...
从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事...
从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事...
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃..
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃..
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃..
学编程 -> 赚钱 -> 娶媳妇 -> 生娃娃..
俄罗斯套娃,文件的遍历
递归算法的前提
1. 必须定义方法
2. 必须有出口
3. 定义的方法必须有形参
4. 在方法内部调用方法自己时,传入的参数要发生变化 --> 变化要往出口方向前进
5. 递归的次数不要太多
递归的内存图

快速排序的原理

File类
File类 : 计算机中所有文件和文件夹的类
结论 : 计算机中要么是文件要么是文件夹
File类的构造方法和自定义常量
*File(String pathname) : 传入一个文件/文件夹路径,让File对象指向这个文件/文件夹;
File(String parent, String child) : 以子父路径的形式去表示File对象 (String表示)
*File(File parent, String child) : 以子父路径的形式去表示File对象 (父路径File对象的形式表示)
File对象的创建做了哪些事情:
1. 创建了对象
2. 开辟了内存空间
3. 让file对象指向了路径结尾的文件/文件夹
File.pathSeparator = ;
File.pathSeparatorChar = ;
File.separator = \
File.separatorChar = \
File类的创建功能
* boolean createNewFile(): 创建文件
boolean mkDir(): 创建单级文件夹
* boolean mkDirs(): 创建单级文件夹或者多级文件夹
相对路径和绝对路径
绝对路径 : 绝对能找到文件/文件夹的路径 --> 完整路径
特点 : 以盘符开头
相对路径 : 以参照物为起点,向路径内寻找文件/文件夹
特点 : 不以盘符开头
寄快递:
绝对路径 : 地球:\\亚洲\\中国\\湖北\\武汉\\洪山\\雄楚大道\\金地中心城\\6号楼\\4楼\\402\\李博闻
相对路径 :
6号楼\\4楼\\402\\李博闻
File类的删除功能
boolean delete(): 删除文件/文件夹, 不走回收站!!
File类的获取功能
* String getName() : 获取文件/文件夹的名称
* long length() : 获取文件的大小(所占字节数)
String getAbsolutePath() : 以字符串的形式返回file对象指向的文件/文件夹的绝对路径
File getAbsoluteFile() : 以File对象的形式返回file对象指向的文件/文件夹的绝对路径
String getParent() : 以字符串的形式返回file对象指向的文件/文件夹的父路径
File getParentFile() : 以File对象的形式返回file对象指向的文件/文件夹的父路径
String getPath() : 获取创建File对象时,传入的文件/文件夹的路径(File类的toString方法内部就是在调用getPath)
long lastModified() : 获取File对象指向的文件/文件夹最后一次修改的时间 -> 毫秒值
File类的判断功能
* boolean exists() : 判断File对象指向的文件/文件夹是否存在!!
* boolean isFile() : 判断File对象指向的文件/文件夹是否是文件
* boolean isDirectory() : 判断File对象指向的文件/文件夹是否是文件夹
boolean isAbsolute() : 判断创建File对象时传入的是否是绝对路径
boolean isHidden() : 判断file对象指向的文件/文件夹是否是隐藏文件/文件夹
文件夹的遍历功能
* File[] listFiles() : 把一个文件夹中所有的文件/文件夹获取到,存入到File[]数组中 -> 只能获取当级文件夹
如果file对象指向的是一个文件,那么方法的返回值是null --> 发生空指针异常
如果file对象指向的是一个空文件夹,那么方法会返回一个内容为0的空数组 -> 不会出现空指针异常
* File[] listFiles(FileFilter filter)
FileFilter filter: 文件夹过滤器 --> 接口
有且仅有一个抽象方法: boolean accept(File file) -> 重写后就是对file对象进行某种判断
如果返回值是true,通过 / 如果返回值是false,不通过
I/O概述
I/O流 技术 : 实现了Java代码和硬盘上文件的数据交互 --> 数据的永久存储
I : input -> 输入
O : output -> 输出
流 : 水流
搞清楚什么时候用输入流/什么时候用输出流 ? 参照物: 当前Java文件
代码数据 ---> 文件内 : 输出流
文件内容 ---> 代码中 : 输入流
I / O 流的分类 :
流向分类 : 输入流和输出流 Input/Reader 和 Output/Writer
操作的文件类型分类:
字节文件(计算机中所有的文件都是字节文件) : 以Stream结尾 -> 字节流;
字符文件(字节文件中有一类文件,文件中都是字符 -> txt,java,xml,html,js,md....) : 以Reader/Writer结尾的流 --> 字符流
InputStream : 字节输入流
BufferedWriter : 高效字符输出流
OutputStreamWriter : 字符输出流 -> 转换流: 把字节流转换成字符流的流
字节流体系结构
字节流的根节点: InputStream/OutputStream -> 抽象类
子类 :
文件字节流(普通字节流) : FileInputStream/FileOutputStream
高效字节流: BufferedInputStream/BufferedOutputStream
FileOutputStream
FileOutputStream : 文件字节输出流
构造方法:
FileOutputStream(String name) : 传入文件的字符串类型路径,让字节输出流对象指向这个文件;
FileOutputStream(File file) : 传入文件的File类型路径,让字节输出流对象指向这个文件;
字节输出流对象的创建做了哪些事情:
1. 创建了对象
2. 开辟了内存空间
3. 文件不存在会帮你创建文件,文件存在会创建新文件覆盖原文件
4. 让输出流对象指向路径结尾的文件 (这里只能是文件)
FileOutputStream写数据的方法
写数据的方法 : void write -> 写的是字节
* void write(int b) : 一次写一个字节
void write(byte[] b) : 一次写一整个字节数组
* void write(byte[] b, int off, int len) : 一次写一个字节数组的一部分
int off -> int startIndex : 起始索引
int length -> 写几个
如何写字符串 ? String -> 字节数组
byte[] getBytes()
如何写换行符 ? "\r\n".getBytes()
如何追加写 ? boolean append 追加写开关
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
FileInputStream
FileInputStream : 普通字节输入流
构造方法:
FileInputStream(String name)
FileInputStream(File file)
FileInputStream读数据的方法
读数据的方法 : int read -> 读的是字节
* int read() : 一次读一个字节 -> 返回值是读到的字节
* int read(byte[] b) : 一次读一个字节数组
int read(byte[] b, int off, int len) : 一次读一个字节数组的一部分