关于IO流

venus224 2012-11-15 03:43:10
InputStream is = null;

is.close();
效果是否一样?
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cengjingyiwei 2012-11-16
  • 打赏
  • 举报
回复
楼上都是正解,感觉楼主还没有理解函数调用与函数定义的区别。
huntor 2012-11-15
  • 打赏
  • 举报
回复
引用 5 楼 venus224 的回复:
引用 3 楼 dr8737010 的回复:InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。 Java code?12345678910111……
由方法的调用者负责关闭流。就像URL类的openStream方法
chenjwjw 2012-11-15
  • 打赏
  • 举报
回复
不close或flush资源是无法写入到文件中去的,而将对象的引用置为null只是改变了对象的引用,等待GC回收,资源并没有写入到文件!
BadPattern 2012-11-15
  • 打赏
  • 举报
回复
引用 7 楼 venus224 的回复:
引用 6 楼 dr8737010 的回复:引用 5 楼 venus224 的回复:引用 3 楼 dr8737010 的回复:InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后……
流使用完了记得释放就行了,不释放进程退出以后,所占用的文件描述符会被操作系统回收。
venus224 2012-11-15
  • 打赏
  • 举报
回复
引用 6 楼 dr8737010 的回复:
引用 5 楼 venus224 的回复:引用 3 楼 dr8737010 的回复:InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。 Java……
那其实资源还是相当于没有释放,会不会有隐患?
BadPattern 2012-11-15
  • 打赏
  • 举报
回复
引用 5 楼 venus224 的回复:
引用 3 楼 dr8737010 的回复:InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。 Java code?12345678910111……
流的关闭要在使用完以后再执行,你这里这个方法需要将流返回出去给其他方法使用,这没问题,肯定不能关闭,但其他地方使用了这个流以后要关闭。
venus224 2012-11-15
  • 打赏
  • 举报
回复
引用 3 楼 dr8737010 的回复:
InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。
public InputStream getUrlInputStream() throws Exception {
		URL url = null;
		InputStream is = null;
		try {
			inputPath = URLDecoder.decode(inputPath, "UTF-8");
			url = new URL(inputPath);
			is = url.openStream();
		} catch (Exception ex) {
			ex.printStackTrace();
		} 
		/**finally {
			try {
				//if (is != null)
					//is.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}*/
		return is;
	}
如果是这个代码,关闭了就无法返回资源了?这个要怎么处理呢?
BadPattern 2012-11-15
  • 打赏
  • 举报
回复
查看了流的close源码,最终会调用到操作系统提供的接口close(int fd)函数,每个打开的流都和一个文件描述符fd对应,这个函数的作用是:closes a file descriptor, so that it no longer refers to any file and may be reused. 很显然这种功能是将一个引用置null做不到的。
BadPattern 2012-11-15
  • 打赏
  • 举报
回复
InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。 所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。
aimsgmiss 2012-11-15
  • 打赏
  • 举报
回复
哪个说的是一样的!
boey584 2012-11-15
  • 打赏
  • 举报
回复
不一样。is.close();是手动的关闭输入流,它将当前缓存中内容输出完毕,并且关闭相关占用的资源,而InputStream is = null; 只是把输入流对象的引用释放掉了。有些数据还在缓存里,并没有真正写进文件,最好自己手动关,把缓存的数据都写进文件,而且如果你不关的话,可能别的程序就不能访问这个文件了,关了也节省资源,良好的习惯

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧