黑马程序员技术交流社区
标题:
io流关闭问题
[打印本页]
作者:
何羡玉
时间:
2013-5-18 12:53
标题:
io流关闭问题
本帖最后由 何羡玉 于 2013-5-18 14:49 编辑
我下面的代码如果注释fw.close() 的话 就能取得正常结果,如果不注释fw.close()的话则会抛异常,为什么会跑异常呢,我都是在for循环外面关流的,只有跳出了循环才会关流啊。而且如果我关流的话,只会遍历一部分的.java文件出来,如果我不关,则全部会遍历,这是为什么?????
package enhanceTest;
import java.io.*;
public class Demo9 {
private FileWriter fw=null;
private File dir=null;
public Demo9(File dir) throws Exception
{
System.out.println("hahahha5");
fw=new FileWriter("e:\\list.txt");
this.dir=dir;
}
public void listj(File dir) throws Exception
{
File[] filess=dir.listFiles();
for(File files:filess)
{
if(files.isDirectory())
{
System.out.println("hahahah1");
listj(files);
}
else{
if(files.getName().endsWith(".java"))
{
fw.write(files.getAbsolutePath());
fw.write("\r\n");
fw.flush();
}
}
}
fw.close(); //如果注释掉,则正常运行,如果不注释就跑异常,为什么???
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File dir=new File("E:\\myworkspace\\day25Test1");
Demo9 d=new Demo9(dir);
d.listj(dir);
}
}
作者:
韩秀山
时间:
2013-5-18 13:50
本帖最后由 韩秀山 于 2013-5-18 13:52 编辑
IO流,当使用Io连接一个资源文件,对资源进行处理; 处理完必须要关闭流连接。
我举一个例子吧:
比如:这个文件就是一个房间:使用IO相当与你要去这个房间拿东西。
在房间里调用。close()就 相当于 把自己锁在屋子里面了。当然会报异常了。
要在操作完方法之后,在把门锁上。。。
作者:
回首、后_街
时间:
2013-5-18 14:18
你这个异常是因为还没有把所有的文件读完就去关流!
你这样子写是读完最里层的一个文件夹中的文件就关一次流!依次这样推,执行完一次方法就关一次!所以会报错!
你要保证是你传入文件夹的下一层目录全部读完之后再关闭流!就不会报错了!
可能说的不是很清楚!给你看一下代码就知道了!
if(this.dir.getAbsoluteFile().equals(dir.getAbsolutePath())){ //这个判断就是保证你读完根目录下的所有文件夹或文件在关流,E:\\myworkspace\\day25Test1
//就是读完这个文件夹中的所有文件夹和文件后才关流, 也就是最后一次递归完执行
fw.close();
}
不明白可以再问我!
作者:
萌小子
时间:
2013-5-18 14:29
本帖最后由 王盟盟 于 2013-5-18 14:36 编辑
你这个问题是出在递归调用上。如果文件列表里有一个文件夹,程序会递归调用,当程序检查完最里层的文件夹for循环执行完毕,IO流就会被关闭。而这时程序会回到上层调用的位置,IO流已经被关闭,所以会报出java.io.IOException: Stream closed这个异常。简单的说呢,就是你应该将fw.close()流放在listj()外面。也可以按照上面说的,吧fw.close()放在那个if语句里
if(this.dir.getAbsoluteFile().equals(dir.getAbsolutePath())){
fw.close();
}
作者:
蚂蚁搬家
时间:
2013-5-18 14:44
楼上说得对,close方法不注释掉的话,在遍历完一个子文件夹后就关闭了流,但是list方法的递归调用并未结束,它还要去遍历其它的子文件夹啊。
把close方法放在main函数的 d.listj(dir);后面就O了
作者:
无妄无涯
时间:
2013-5-18 14:46
按照你的代码,读取完一层文件夹中的文件就会将IO流关闭,当存在多层文件夹时,递归读取完最里层文件夹返回上层时IO流已经不存在了,自然会出现流关闭异常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2