static void test04() throws FileNotFoundException {/* FileOutputStream(FileDescriptor fdObj)创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。*///将系统的输出流设置为标准输出流  FileDescriptor.out 系统的输出流
//系统的println(是同步的方法)System.setOut(new PrintStream(new FileOutputStream("d:/test/outout.txt"),false));System.out.println("出去拉");System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out),false));System.out.println("haha系统输出");
}

有几个问题
1、System类加载之后out对象是怎么设置为FileDescriptor.out的
2、为什么对于final对象 可以调用static void setOut(PrintStream out) 修改
native 底层是怎么样的

由于java是支持多线程的,所以标准的输入输出是共享,因此它们必须受到特别的处理,在系统初始化完成之前,线程严禁使用这几个特殊对象;又因为这些对象都是静态的,因此java的类加载机制会在System类加载的时候就会初始化,这就造成了一对矛盾;为解决这对矛盾,System在加载是将它们初始化为null,等加在完成后,通过native方法在对它们进行赋值:

在线程初始化完成后,系统会调用方法initializeSystemClass设置这几个特殊对象的值:

......FileInputStream fdIn = new FileInputStream(FileDescriptor.in);FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);setIn0(new BufferedInputStream(fdIn));setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));setErr0(newPrintStream(fdErr,      props.getProperty("sun.stderr.encoding")));
......

System.setOut()重定向输出解释相关推荐

  1. System.setOut 重定向 memcached 的输出

    System.setOut 重定向 memcached 的输出 调用 memcached 的方法 pool = SockIOPool.getInstance(poolName); 此代码并未抛出异常, ...

  2. System.setOut(ps)重定义了输出流后,如何重定向控制台输出

    可以用 System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 重新定位到标准输出流

  3. 用System中System.setOut()方法修改输出方式

    方法:重写PrintStream里的println方法 ​ public static void main(String[] args) throws FileNotFoundException {i ...

  4. Java重定向输出输入错误流实现程序日志

    调用系统类中的放样()方法改变输出流 放样方法 用于重新分配系统类的标准输出流 声明方法如下: public static void setOut(PrintStreaam out) 实例1:创建Re ...

  5. 深入理解虚拟机实战:修改class文件实现System标准输出重定向

    一.背景 在深入理解Java虚拟机的过程中,理解java程序在虚拟机层次如何执行十分重要.了解了深层次的东西,才可以实现一般情况下做不到的特殊功能,而这种特殊功能面向的对象往往是程序员本身.下面我们通 ...

  6. 真·浅谈System.setOut()

    java中我们熟悉的输出System.out.println()只能将数据输出到控制台上,那么我们像要将数据输出到背的地方时该怎么办? System.setOut()来了. System.out是 S ...

  7. PrintStream和System.setOut(PrintStream ps)用法

    PrintStream:为其他输出流添加了功能,是他们能够方便的打印各种数据值的表现形式. 1. 永远不会抛出IOException,异常情况可通过checkError()方法测试的内部结构: 2. ...

  8. Java使用System.setOut()对输出流进行重新分配

    setOut: 改变输出流 public class App {public static void main(String[] args) throws FileNotFoundException ...

  9. 【linux笔记】vi和vim编辑器,重定向输出,系统命令,进程,管道

    vi/vim 在linux下一般使用vi编辑器来编辑文件 Vi既可以查看文件也可以编辑文件. 三种模式: 命令行.插入.底行模式 切换到命令行模式:ESC键 切换到插入模式:按i,o,a键 切换到底行 ...

最新文章

  1. python3.6.5安装-Ubuntu16.04安装python3.6.5详细步骤
  2. 昨日之我,今日之我与明日之我
  3. Nagios(页面)报错: Return code of 13 is out of bounds
  4. android computescroll_Android问题:自定义ViewGroup,重载computeScroll()方法有什么用?...
  5. Cortex M3存储器映射
  6. 北京环球度假区:尚未发布票务信息,未面向公众销售任何门票
  7. IC设计常用文件及格式介绍
  8. DevOps 火爆,要学这么多技术!
  9. jquery选择器从认识到使用初级篇
  10. 视频不显示的分析方法
  11. Spring Cloud Hystrix Dashboard仪表盘 和 Turbine集群监控 (学习总结)
  12. English trip V2 - 9 People and Places Teacher:Julia Key: at on in
  13. 柔性电子综述2014:Wearable Electronics and Smart Textiles 可穿戴电子设备
  14. [生存志] 第142节 韩赵陈郑燕辽
  15. Excel合并计算和分类汇总
  16. vue实现七天免登录(cookie)
  17. 如何解除病毒对各种杀毒软件的劫持
  18. 上班一个月挣10万,居然全靠它...
  19. http状态码查询表(转载)
  20. 重载和重写的区别是什么

热门文章

  1. 什么是GPU计算?阿里云国际版有没有GPU计算?-Unirech
  2. 无盘服务器4根网线雨两根网线的区别,网线接法的描述:实际用到4根。
  3. JAVA——请输入打印一个倒99乘法口诀
  4. 两数互素有什么性质_两个数互素的性质
  5. 运营实战:5个步骤分析目标人群画像流程图
  6. 华硕ASUS FZ63VD fn快捷键失灵
  7. ImageLoader加载图片闪烁
  8. CentOS7下安装和开启远程连接reids
  9. 观李永乐《皇帝的新衣》后感以及红蓝眼悖论解题思路
  10. Bother, disturb and trouble 三个表示 “打扰” 的词语区分