1、深度遍历,不仅遍历指定路径下的文件名,还遍历文件里的子文件名,即所有的文件都遍历一边,别遍历系统文件,会发生空指针异常,有些系统文件不让遍历。
2、递归的使用:直接或间接被重复调用
直接show() {show()}, 间接调用如下图所示
递归示意图:从左向右一直进栈,等最后进栈的函数满足条件结束后,从右向左一直出栈。
windows的删除机制是从里往外删,所以想删除一个文件夹,必须先进到最里面删除最内部的文件,这个思想就和递归调用的思想一样,先完成最里面的,再从里向外一层一层出来
syso(file)时,调用File类对象的toString方法,打印的是File对象的绝对路径,下图中s文件夹当时窗口打开,所以没有删掉。
3、list输出流
list()显示出集合里面的内容。
4、Properties集合的store方法,一般情况下Properties集合的键值对都存在内存中,如果想将其保存下来到硬盘的文件,就必须借助月store()方法
其中store(fos,"name+age")的name+age是注释信息。
5、加载硬盘文件里的键值对信息用load方法,加载的原理是把键值对的两端以等号分开,分别转换为字符串,赋给Properties集合的键和值。
下面模拟load方法,自己写一个myLoad()方法,需要注意的是文件里的注释信息只是方便阅读才有的,并不是有用的信息,所以不能也不用存入到Properties集合中去。
注意用一句line.startWith("#")来判断。集合用来修改操作数据,而流获取存储数据。流可以直接操作对象的。以前是new一个输出输出流去操作路径文件,现在直接将那个路径文件封装成File对象,有更多的方法可以使用了。也方便流直接操作。
注意在输出流时,new FileWriter(file),此时会创建一个新的同名文件覆盖以前的那个。所以写成下面的形式是不对的,因为信息都还没有读进去就已经被空白的同名文件重新覆盖了。
6、简单属性用Properties保存,复杂信息用xml标签的形式来解决
7、综合练习—文件清单列表
8、打印字节流—PrintStream
PrintStream是为数不多的永远不抛IOException的流对象。PrintStream的构造函数也可以操作文件file
9、打印字符流-PrintWriter
BufferedWriter才有newLine()换行的,PrintWiter里面没有newLine()方法,但是它有println()打印并换行的功能。
想保证数据原样性,直接用print就ok。
当构造函数里有true,而刚好用了下面3个方法时,由于会自动刷新,所以不再需要写玩一行手动添加一句flush。
如果输出到文件先自动刷新,那将文件封装到字节流中,因为只有字节流才可以刷新。
PrintWriter可以保持写出数据的原样性(因为转为字符串输出了),但是不能保证输出的大小,就像前面的97变成2个字节
10、SequenceInputStream序列流,就是把几个流按顺序合并在一起,一个一个一次输入,可以理解为将几个文件合并为1个文件。
由构造函数可知:当想合并3个及以上的流时,必须用枚举,而我们要把各种流放在容器中,能存储枚举的容器有Vector。这里自己做的固定长度缓冲器,因为要合并的还可以是多媒体文件,所以用的是字节流。
但是Vector的效率太低了,用ArrayList来代替,但ArrayList不支持获取枚举对象。只能自己获取,但是枚举的功能和迭代器相同重复
注意:内部类在访问内部类外的局部变量的时候,局部变量要加上final。
一般情况下没有找到,现在Collections工具类中找,实在找不到才考虑自己写 。