① java socket中关闭IO流后,发生什么事
为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言。同 样的,din是输入流的代言。
可以造成dout被关闭的操作有:
1、调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出流都将不可再用。
2、调用socket.close();
3、调用socket.shutdownOutputStream();单方面关闭dout,此时din还可正常使用。
以下,我将对socket中关闭输出流进行3个测试:
输出流关闭测试一:socket关闭吗?
输出流关闭测试二:该流是否可以重新开启?
输出流关闭测试三:输出缓冲区里的数据是丢弃,还是发送?
测试结果如下:
测试一:dout.close();会造成socket被关闭,但socket.shutdownOutputStream()不会。
测试二:不可以,会抛出异常!
测试三:丢弃
转载
② java io流的关闭问题。
你BufferedReader是通过fileReader来的,相当于你关闭br后就直接关闭了FileReader,最后建议你把br=null;
和这个相反你可以参考一下rs和con的关系
③ java中IO流操作怎样关闭流
如果 in == null,就说明 in这个引用所指向的对象还没有被创建,自然 in.close()也就不可能被执行,而且会报异常。我是这样想的,程序中 如果你先声明变量
InputStream(或者其他流类型) in = null;
然后执行其他语句,再 in = new 、、、、
在in new之前其他语句出exception,这时流没有被打开,也就无需关闭,如果不判断if(null != in) 硬要关闭in就出exception
另外你的代码按如下写会更合理:
if(null != in){
try{
in.flush();
in.close();
in = null;
}
catch(IOExection e){};
}
④ Java IO流中先关闭输出流还是先关闭输入流为什么
java中需要手动释放的资源常见的有以下两个:
流相关资源
流相关资源一般遵循:
1)先开后关,先开的输入流,再开的输出流,通过读取输入流写入输出流中,那么应该先关输出流,再关输入流,但是一般关闭输入输出流操作都是在读写完成后的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流关闭的一点疑问,求大佬们帮帮忙
如果上面没有对流进行手动关闭的话,finally方法中的fis一定不为空
⑥ java关闭IO流的时候Socket也同时关闭
楼主解决了么,我想到一个办法:
服务端:就是每次接收到一个客户端请求以后,都重新启动一个线程用于逻辑处理,处理完毕后关闭该线程会自动关闭。
客户端:每次发送/接收数据都新建一个socket ,发送完/传输完就关闭当前socket
⑦ java中IO流关闭时的疑惑
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
/*
*加入异常处理的字节输出流操作
*/
{
publicstaticvoidmain(String[]args){
//分开做异常处理
//FileOutputStreamfos=null;
//try{
//fos=newFileOutputStream("fos4.txt");
//}catch(FileNotFoundExceptione){
//e.printStackTrace();
//}
//
//try{
//fos.write("java".getBytes());
//}catch(IOExceptione){
//e.printStackTrace();
//}
//
//try{
//fos.close();
//}catch(IOExceptione){
//e.printStackTrace();
//}
//一起做异常处理
//try{
//FileOutputStreamfos=newFileOutputStream("fos4.txt");
//fos.write("java".getBytes());
//fos.close();
//}catch(FileNotFoundExceptione){
//e.printStackTrace();
//}catch(IOExceptione){
//e.printStackTrace();
//}
//改进版
//为了在finally里面能够看到该对象就必须定义到外面,为了访问不出问题,还必须给初始化值
FileOutputStreamfos=null;
try{
//fos=newFileOutputStream("z:\fos4.txt");
fos=newFileOutputStream("fos4.txt");
fos.write("java".getBytes());
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//如果fos不是null,才需要close()
if(fos!=null){
//为了保证close()一定会执行,就放到这里了
try{
fos.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
⑧ Java中怎么判断一个io流是否已经关闭
try{
inputstream.read();
Syste.out.println("流未关闭");
}cache(Exceptione){
Syste.out.println("流已关闭");
}
⑨ Java中的io流关闭问题
如下例子代码:
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