Java中的io流关闭问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的io流关闭问题相关的知识,希望对你有一定的参考价值。
java.io.IOException: Stream closed
at java.io.BufferedWriter.ensureOpen(Unknown Source)
at java.io.BufferedWriter.write(Unknown Source)
at java.io.Writer.write(Unknown Source)
at CommodityManage.write(CommodityManage.java:86)
at CommodityManage.add(CommodityManage.java:25)
at Command.analyse(Command.java:14)
at Server.main(Server.java:24)
这是出现的问题
public void write(String filepath)
try
String encoding = "GBK";
File f=new File(filepath);
if(f.isFile()&&f.exists())
BufferedWriter bw=new BufferedWriter(new FileWriter(f,false));
for(int i=0;i<commoditylist.size();i++)
bw.write(getInfo(commoditylist.get(i))+"\r\n");
bw.close();
else
f.createNewFile();
catch(Exception e)
e.printStackTrace();
这是代码,哪里有问题了呀
FileInputStream is = new FileInputStream(".");
BufferedInputStream bis = new BufferedInputStream(is);
bis.close();
从设计模式上看:
java.io.BufferedInputStream是java.io.InputStream的装饰类。
BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。
BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
java.io.BufferedInputStream的api:
close
public void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
public static void main(String[] args) throws Exception
FileOutputStream fos = new FileOutputStream("d:\\\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
验证ok 参考技术A bw.close()调用不应该在for循环中,因为java语言中,文件对象只能close一次。本回答被提问者采纳 参考技术B 把bw.close()从for 循环里拿出来,要不然读了第一次就把流给关了 参考技术C 你没有开IO流啊 参考技术D 几种可能的异常(IOException的一些子类,这些是有关文件读写方面可能抛出的异常,还可能有其他方面异常,参考JDK API文档的IOException类的子类)
总体说有:文件不存在,读取写入出错(如磁盘硬件错误、写保护、无空间等),权限问题(文件被锁定、无访问权限等)
EOFException:
当输入过程中意外到达文件或流的末尾时,抛出此异常。
此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。
FileLockInterruptionException:
当某个线程正在等待获取文件锁定时被另一个线程中断,则由该线程接收此经过检查的异常。抛出此异常之前,将设置以前被阻塞的线程的中断状态。
FileNotFoundException:
当试图打开指定路径名表示的文件失败时,抛出此异常。
在不存在具有指定路径名的文件时,此异常将由 FileInputStream、FileOutputStream 和
RandomAccessFile
构造方法抛出。如果该文件存在,但是由于某些原因不可访问,比如试图打开一个只读文件进行写入,则此时这些构造方法仍然会抛出该异常。
IIOException:
该异常类用于发出关于读取和写入操作的运行时故障的信号。
InterruptedIOException:
I/O 操作已中断信号,抛出此异常。抛出 InterruptedIOException
指示输入或输出传输已经终止,原因是执行此操作的线程中断。字段 bytesTransferred
指示在发生中断之前已成功传输了多少字节。
这样可以么?
Java IO流中先关闭输出流还是先关闭输入流?为什么?
java中需要手动释放的资源bai常见的有以下两个:
流相du关资zhi源
流相关资源一般遵循:
1)先开后关dao,先开的输入流,再开的输出流,通过读取输入流写入输出流中,那么应该先关输出流,再关输入流,但是一般关闭输入输出流操作都是在读写完成后的finally中执行的,所以即使先关输入流,再关输出流也不会任何问题,因为读写操作没有进行了。
2)先关外层,再关内层。如BufferedInputStream包装了一个FileInputStream,那么先
关BufferedInputStream,再关FileInputStream。但要注意的是由于一般处理流持有节点流引用,处理流都会在自己的close方法中去关闭节点流,因此我们只要关闭外层的处理流即可,如果多此一举的关闭节点流反而会报错。如BufferedInputStream包装了FileInputStream,我们只要关闭BufferedInputStream即可
3)只关处理流,不关节点流,原因见上述第二条
流相关文章参考:http://blog.csdn.net/u012250875/article/details/78341874
jdbc相关资源
Connection,PrepareStatement,ResultSet三个资源。这三个资源的获取顺序是:
先获得一个jdbc连接对象Connection,再通过连接对象获得一个sql预处理对象PrepareStatement,如果是查询的话最后还会通过PrepareStatement对象获取一个结果集ResultSet对象,关闭顺序与获取顺序正好相反。先关ResultSet,再关PrepareStatement,最后关Connection。
以上是关于Java中的io流关闭问题的主要内容,如果未能解决你的问题,请参考以下文章