1. 递归
方法内部调用方法本身的一种编程技巧。
-- 把复杂的问题分解成若干类似的简单的问题,一致持续下去,直到简单的问题能够直接求解。
那么原来复杂的问题就由简单问题的答案反推得解。
注意:
递归必须有出口。
递归的次数不能太多。
构造方法不能递归调用。
写递归方法:
1) 找出口
2) 找规律
应用:
1) 阶乘
2) 斐波那契数列(黄金分割数列)
1 1 2 3 5 8 13。。。
补充: 穷举法 -- 列出足够多的项来找规律, 通过任意一项验证一下。
3) 遍历获取目录下(包括子目录)所有指定文件
注意:
File[] fileArray = file.listFiles();
// 此处加做一个非null判断(因为有些文件是没有操作权限的,是拿不到的)
if(fileArray != null){
// 再做其他的业务逻辑
}
4) 删除带子内容的文件夹
注意:
删除完了文件夹下的文件,循环的外面别忘了删除该文件夹
练习:
需求:用递归求下列数列的第二十项的值:
1,1,2,4,7,13,24...
2. 字符流
IO流程序操作步骤:
1)封装数据源
-- 创建输入流对象
2)封装目的地
-- 创建输出流对象
3)读写操作
-- (如果是字符流)刷新数据
4)释放资源
-- close()
3. 字符输出流
继承结构:
Writer -- OutputStreamWriter -- FileWriter
FileWriter构造:
FileWriter(File file)
FileWriter(String pathname)
-- 只要不抛出异常,文件就会被覆盖式创建
FileWriter(File file, boolean append)
FileWriter(String pathname, boolean append)
-- 是否追加写入
此处做了三件事情:
1)调用系统资源创建文件
2)创建字符输出流对象
3)将输出流对象指向创建的文件
写入数据的功能:
write(String str)
-- 写入一个字符串
write(String str, int start, int len)
-- 写入一个字符串
write(char[] chs)
-- 写入一个字符数组
write(char[] chs, int start, int len)
-- 写入一个字符数组一部分
write(char ch)
-- 写入一个字符
"\r\n" - windows
"\n" -- linux
"\r" -- mac
刷新数据:
flush()
-- 因为是字符流,所以要刷新缓冲区
释放资源:
close()
1) 让流对象变成垃圾
2) 通知系统去释放与文件相关的资源
问题1:为什么FileWriter没有无参构造方法?
因为写数据的时候,一定要明确写到哪里去。
问题2:flush()和close()的区别?
flush():只刷新缓冲区,流对象还可以继续使用。
close():先刷新缓冲区,再关闭流对象。流对象不可以继续被使用
问题3:难道每次调用方法的时候,都需要刷新吗? 或者说,不用刷,直接等到close()来解决,行不行?
这两种方式都不可取。应该设置刷新条件.
4. 字符输入流FileReader
继承结构:
Reader -- InputStreamReader -- FileReader
构造方法:
FileReader(File file)
FileReader(String pathname)
读取数据方式1: 一次读取一个字符
重要部分的代码:
/*
int ch = fr.read();
while (ch != -1) {
sop((char) ch);
ch = fr.read();
}
*/
int ch = 0;
while ((ch = fr.read()) != -1) {
//sop((char) ch);
fw.write(ch);
}
读取数据方式2: 一次读取一个字符数组
int read(char[] chs)
-- 返回值int表示实际的读取长度
char[] chs = new char[1024];
int len = 0;
while((len = fr.read(chs)) != -1){
fw.write(chs, 0, len);
}
注意事项:
fr.read(chs) -- 别忘了把数组传进去
fw.write(chs, 0, len); -- 别忘了写入数组的实际读取长度
|
|