System.out需要释放不?

chenniaoc 2010-02-22 01:59:48
在更改System.out 引用之后,进行再次修改时,如果不把之前的OutputStream关闭掉,会不会造成资源的泄露? 从而引发内存问题?


比如

//①保留系统默认流对象
PrintStream out = System.out;
//②然后更改
System.out = new new PrintStream();
//③还原默认outputStream 
System.out = out;

在执行第三步的时候,如果没有对步骤2中System.out流进行关闭操作,会不会产生问题?

有必要调用System.out.close()方法吗?
...全文
378 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwangt_99 2010-02-28
  • 打赏
  • 举报
回复
JAVA垃圾回收机制会处理这个,但如果想更好的利用资源,最好手动CLOSE。

LZ可以根据实际情况决定是否CLOSE。
网络咖啡 2010-02-28
  • 打赏
  • 举报
回复
不需要手动释放的,系统会管理的
yanghuistart 2010-02-27
  • 打赏
  • 举报
回复
JAVA垃圾回收机制会处理这个,但如果想更好的利用资源,最好手动CLOSE。
JavaAlpha 2010-02-27
  • 打赏
  • 举报
回复
测试了一下 23楼的

结果是 关了就没有了

树成 2010-02-27
  • 打赏
  • 举报
回复
关于System.out,他是一个显示设备输出流,对其进行close是没有意义的,好像jdk doc上面也说了,其close方法是个空实现,也就是说,你调用了close方法,其实跟不调用没什么区别。
如果你使用System.setOut,使用了自己的输出流,如果这个流指向网络或者文件系统,那么就要close掉了。
xuexi100 2010-02-27
  • 打赏
  • 举报
回复
BearKin 2010-02-23
  • 打赏
  • 举报
回复
引用 23 楼 dinghun8leech 的回复:
不会出异常
输出到本地文件理论上可以,实际试验后发现真的可以。
Java codeimport java.io.BufferedOutputStream;import java.io.File;import java.io.FileDescriptor;import java.io.FileOutputStream;import java.io.PrintStream;publicclass TestChangeOut {publicstaticvoid main(String [] args)throws Exception {//当前System.out的hashcode System.out.println(System.out);//关闭当前System的out标准输出流 System.out.close();//这步因上一步的关系无任何输出 System.out.println("~");//FileDescriptor.out 标准输出流的句柄。通常,此文件描述符不是直接使用的,而是通过称为 System.out 的输出流使用的。//FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);//换成输出本地的方式也可以 FileOutputStream fdOut=new FileOutputStream(new File("C:/mytxt.txt"));
PrintStream newOut=new PrintStream(new BufferedOutputStream(fdOut,128),true);//设置新的标准输出流 System.setOut(newOut);//新的System.out的hashcode,与旧的不一样 System.out.println(System.out);
}
}

这个有用 记到肚皮上
dinghun8leech 2010-02-23
  • 打赏
  • 举报
回复
不会出异常
输出到本地文件理论上可以,实际试验后发现真的可以。
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class TestChangeOut {
public static void main(String [] args) throws Exception {
//当前System.out的hashcode
System.out.println(System.out);
//关闭当前System的out标准输出流
System.out.close();
//这步因上一步的关系无任何输出
System.out.println("~");
//FileDescriptor.out 标准输出流的句柄。通常,此文件描述符不是直接使用的,而是通过称为 System.out 的输出流使用的。
//FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
//换成输出本地的方式也可以
FileOutputStream fdOut = new FileOutputStream(new File("C:/mytxt.txt"));
PrintStream newOut = new PrintStream(new BufferedOutputStream(fdOut, 128), true);
//设置新的标准输出流
System.setOut(newOut);
//新的System.out的hashcode,与旧的不一样
System.out.println(System.out);
}
}
BearKin 2010-02-23
  • 打赏
  • 举报
回复
引用 21 楼 dinghun8leech 的回复:
引用 19 楼 bearkin 的回复:如果关闭了的话那是不是就不能用了呢? 关闭了之后有什么效果?
关闭了之后就打不出来了,如我上面的那段代码。

结论是,背后原理不得而知,但System.out这个标准输出流确实没必要关闭。


没异常么?
另外 如果将System.out的输出流换成普通的输出流 比如输出到某个文件上 可以不可以呢?
dinghun8leech 2010-02-23
  • 打赏
  • 举报
回复
引用 19 楼 bearkin 的回复:
如果关闭了的话那是不是就不能用了呢? 关闭了之后有什么效果?

关闭了之后就打不出来了,如我上面的那段代码。

结论是,背后原理不得而知,但System.out这个标准输出流确实没必要关闭。
zings 2010-02-23
  • 打赏
  • 举报
回复
从来没这样深入想过。。。向大家学习。。。
BearKin 2010-02-23
  • 打赏
  • 举报
回复
引用 18 楼 bao110908 的回复:
呵呵,System 这个类是非常奇怪,其语法结构已经超出了 Java 语言的范围,比如 out, in, err 都是 final 的,但是使用 setOut 也可以重新赋值。再比如,out, in, err 都是在 initializeSystemClass() 这个 private 的静态方法中赋值的,但是在 System 中也没有任何一个地方调用过这个方法。

这些估计都与其内部的 native 方法有关。

没必要关掉 System.out 的流,虽然执行 System.out.close() 方法,只是关闭与之相关联的 PrintStream 中的内部属性,但是具体的 System.out 实现是由操作系统实现的,Java 也不可能去关闭掉操作系统的流。

这种关闭就好比这样代码的最后一行,没有用。

User user = new User();
user.xxxx
....
user = null;


如果关闭了的话那是不是就不能用了呢? 关闭了之后有什么效果?
  • 打赏
  • 举报
回复
呵呵,System 这个类是非常奇怪,其语法结构已经超出了 Java 语言的范围,比如 out, in, err 都是 final 的,但是使用 setOut 也可以重新赋值。再比如,out, in, err 都是在 initializeSystemClass() 这个 private 的静态方法中赋值的,但是在 System 中也没有任何一个地方调用过这个方法。

这些估计都与其内部的 native 方法有关。

没必要关掉 System.out 的流,虽然执行 System.out.close() 方法,只是关闭与之相关联的 PrintStream 中的内部属性,但是具体的 System.out 实现是由操作系统实现的,Java 也不可能去关闭掉操作系统的流。

这种关闭就好比这样代码的最后一行,没有用。

User user = new User();
user.xxxx
....
user = null;
BearKin 2010-02-23
  • 打赏
  • 举报
回复
楼上说的俺不懂 回复内容又太短
dinghun8leech 2010-02-23
  • 打赏
  • 举报
回复
import java.io.BufferedOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class TestChangeOut {
public static void main(String [] args) {
//当前System.out的hashcode
System.out.println(System.out);
//关闭当前System的out标准输出流
System.out.close();
//这步因上一步的关系无任何输出
System.out.println("~");
//FileDescriptor.out 标准输出流的句柄。通常,此文件描述符不是直接使用的,而是通过称为 System.out 的输出流使用的。
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
PrintStream newOut = new PrintStream(new BufferedOutputStream(fdOut, 128), true);
//设置新的标准输出流
System.setOut(newOut);
//新的System.out的hashcode,与旧的不一样
System.out.println(System.out);
}
}

看了System类和一些其他的类的源码,发现了一些问题(也许是我没耐心看下去)。比如:
1.out常量是final的,照理说是无法再改变其引用地址的,实际测试后发现可以改变。
2.out这个标准控制台输出流实际占多少资源不得而知,但这个不重要,重要的是在这个out被我们更换了新的实例后,旧实例是否当即就被自动close了,这过程里面有包装,甚至还调用了一些非java的本地方法(native)。如果是自动close,那么就表示一个jvm实例同一时间只会拥有一份开启状态的标准输出流实例,那么关不关就无所谓了。
3.引用论坛某位前辈的解答,close不仅仅是告诉jvm这个流被关闭,也告诉了承载jvm的操作系统这一层,这个流被关闭了,也就是说,当我们忘记close而又不再引用此流的实例,gc确实有可能会清扫此实例,但只要jvm进程不停止,操作系统这一层一直会开启这个流而占用一定的资源。
一家之言,谨慎采纳。
acRush7 2010-02-23
  • 打赏
  • 举报
回复
不懂
dinghun8leech 2010-02-23
  • 打赏
  • 举报
回复
引用 25 楼 chenniaoc 的回复:
问题是 转到文件流的时候 如果不关闭掉System.out.close();
直接System.setOut();成默认的流 会不会造成文件资源流没有被关闭掉?
我查了好多地方了 自己也进行了测试,  结论还是无法确定。

如果想把输出到控制台的东西全部改为输出到本地文件中,还是建议自己封装一个方法调用之(当然也要在需要时close),而不是改变System.out
不过有个奇怪的问题:
在同一jvm实例(进程)中只要有一个程序改变了System.out,其他程序中是否也被改变?目前我在eclipse中新建一个类,改变System.out,再用无限循环执行,其每次启动后修改前的hashcode都是一致的(eclipse和正在运行的一个java程序分占了两个javaw.exe进程。一个javaw.exe进程就是一个jvm实例?
chenniaoc 2010-02-23
  • 打赏
  • 举报
回复
问题是 转到文件流的时候 如果不关闭掉System.out.close();

直接System.setOut();成默认的流 会不会造成文件资源流没有被关闭掉?
我查了好多地方了 自己也进行了测试, 结论还是无法确定。

sheng0302 2010-02-23
  • 打赏
  • 举报
回复
kan bu dong cainiao
BearKin 2010-02-22
  • 打赏
  • 举报
回复
引用 12 楼 zhaining522 的回复:
呵呵  你看错了吧
lz写的是
PrintStream out = System.out;

引用 10 楼 bearkin 的回复:System.out = out; 这个能编译过去? 这个out不是final的么?...偶郁闷咯 从没这么想过..

你才看错捏! 偶仔细观察过地!
加载更多回复(12)

62,624

社区成员

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

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