Java中实现递归的方式:
方法内部调用方法自己 (所以必须定义方法)
递归的分类:
直接递归: 方法自己调用方法
间接递归: A方法调用B方法, B方法调用C方法, C方法调用A方法
递归时的注意事项:
1. 递归要有限定条件(出口), 保证递归能够停止(就是在某种情况下方法不再调用自己), 否则会栈内存溢出
2. 递归次数不能太多, 否则会栈内存溢出
3. 构造方法不能递归
递归的使用前提:
调用方法时, 方法的主体不变, 但每次传递的参数值不同, 可以使用递归
IO流: 输入(Input)输出(Output)流
流: 数据流
输入: 从硬盘(文件)读取到内存(Java程序)
输出: 从内存(Java程序)写入到硬盘(文件)
IO流的分类:
字节流 (读写字节: byte, 可以读写所有类型的文件, 包括视频, 图片, 音频, 文本等)
字节输入流: java.io.InputStream 抽象类
字节输出流: java.io.OutputStream 抽象类
字符流 (读写字符: char, String,只能读写文本文件)
字符输入流: java.io.Reader 抽象类
字符输出流: java.io.Writer 抽象类
向文件中写入字节数据时, 十进制的数字会被转换为"二进制"的数字写入文件
文本编辑器打开文本文件时, 会先查询编码表, 将二进制数字转换为对应的字符进行显示
0-127:查询ASCII码表 -128~127
其他: 查询系统默认码表
Windows简体中文系统的程序打开是按GBK 码表
IDEA中使用的是 UTF-8 码表
java.io.FileOutputStream类: 文件字节输出流
//带有 续写 功能的构造方法, 不会清空文件
FileOutputStream(String name,boolean append): 通过文件路径创建流, true可以续写
FileOutputStream(File file,boolean append): 通过File对象创建流, true可以续写
java.io.Reader抽象类: 字符输入流 (顶层)
//常用成员方法
void close():关闭此流并释放与此流相关联的任何系统资源
//读
int read():一次读一个字符char, 返回读到的字符.
读到文件末尾返回-1 (返回int为了代码编写方便)
int read(char[] cbuf):一次读取一个字符数组char[]
返回读取的字符个数. 读到文件末尾返回-1
java.io.FileReader类: 文件字符输入流
//构造方法
FileReader(File file):根据File对象创建文件字符输入流
FileReader(String fileName):根据File对象创建文件字符输入流
flush(): 刷新缓冲区 (将数据从内存中写入到磁盘)
close():刷新缓冲区, 并释放资源. 关闭流后不能再用同一个流对象操作
缓冲流的原理:
底层也是使用基本流(FileXxx)来读写
但缓冲流内部定义了一个缓冲数组, 在读的时候类似于我们一次读一个数组的方式, 减少了磁盘操作次数, 提高了程序效率
BufferedOutputStream使用步骤:
1.创建FileOutputStream对象, 构造方法中绑定要输出的目的地
2.创建BufferedOutputStream对象, 构造方法中传递FileOutputStream对象
3.使用BufferedOutputStream对象中的方法write(), 把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法flush(), 把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据, 第4步可以省略)
|