System.err与System.out区别

时间:2023-02-15 17:36:35
Thinking in java  9章 异常处理 章节中。说:
通过写到System.err而被打印到控制台的标准错误流。通常这比把错误信息输出到
System.out要好,因为System.out也许会被重定向。

这里不理解什么是重定向? 为什么System.err比System.out要好?

25 个解决方案

#1


运行一下这个就知道了,原则上说System.err也可以重定向 ,但在web开发的时候,一般容器会把System.err和System.out重定向到不同的文件中,所以最好还是分开了好
//-------------------------
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class B {
  public static void main(String[] args) {
    try {
      System.setOut(new PrintStream(new FileOutputStream(new File("c:/test.txt"))));
      System.out.println("haha");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

#2


上面的代码只能说明 会存到不同文件中。
不能说明System.err比System.out要好

#3


我也不懂这里

#4


cxz7531(大花猫)  != 闭月羞花猫

#5


学习中

#6


学习了。

#7


不是谁好谁不好的问题. 而是要把一般信息和错误信息分开来比较好.
你要是高兴, 可以把错误用out输出, 一般信息用err输出. 只不过维护人员一定会想杀了你

#8


输入输出可以重定向,一般来讲System.out会经常被重定向,而System.err则不是经常被重定向
所以输出异常还是用err比较合适

#9


同意楼上看法....

#10


大多数操作系统都有三个标准文件描述符:标准输入,标准输出,标准出错。

三个操作系统的文件描述符映射到编程语言的标准库中,往往加了一层包装,但是名字通常还是叫标准输入,标准输出,标准出错。

在其它语言中的一般写法是:stdin,stdout,stderr(有的语言里大写,有的语言里小写)。对应Java中的System.in,System.out,System.err。

在语言层面的实现三个文件描述符都是可以重定向的(只要你想)。但是一般而言,如果你在unix shell或windows command line中使用管道或重定向,则只是针对标准输入和输出。

另外,标准输出和标准出错的一个区别是,标准输出往往是带缓存的,而标准出错没有缓存(默认设置,可以改)。所以如果你用标准出错打印出来的东西可以马上显示在屏幕,而标准输出打印出来的东西可能要再积累几个字符才能一起打印出来。如果你在应用中混用标准输出和标准出错就可能看到这个问题。

我的表达能力有限。总的来说,System.out用于正常的输出,也就是程序真正想输出的内容。而System.err用于出错信息的输出,也就是你本来不期待看到的东西。

#11


楼上,收下我吧!

#12


上上楼高

#13


8楼10楼都很强 :)
我从注释里抄的
/**
     * The "standard" output stream. This stream is already
     * open and ready to accept output data. Typically this stream
     * corresponds to display output or another output destination
     * specified by the host environment or user.
     * <p>
     * For simple stand-alone Java applications, a typical way to write
     * a line of output data is:
     * <blockquote><pre>
     *     System.out.println(data)
     * </pre></blockquote>
     * <p>
     * See the <code>println</code> methods in class <code>PrintStream</code>.
     *
     * @see     java.io.PrintStream#println()
     * @see     java.io.PrintStream#println(boolean)
     * @see     java.io.PrintStream#println(char)
     * @see     java.io.PrintStream#println(char[])
     * @see     java.io.PrintStream#println(double)
     * @see     java.io.PrintStream#println(float)
     * @see     java.io.PrintStream#println(int)
     * @see     java.io.PrintStream#println(long)
     * @see     java.io.PrintStream#println(java.lang.Object)
     * @see     java.io.PrintStream#println(java.lang.String)
     */
    public final static PrintStream out = nullPrintStream();

    /**
     * The "standard" error output stream. This stream is already
     * open and ready to accept output data.
     * <p>
     * Typically this stream corresponds to display output or another
     * output destination specified by the host environment or user. By
     * convention, this output stream is used to display error messages
     * or other information that should come to the immediate attention
     * of a user even if the principal output stream, the value of the
     * variable <code>out</code>, has been redirected to a file or other
     * destination that is typically not continuously monitored.
     */
    public final static PrintStream err = nullPrintStream();

#14


去看看Unix/Linux的输入、输出从定向就知道了

#15


System.err和System.out 就是错误输出和标准输出
如果你用LOG4J记录日志的话,且设定错误等级的话
System.err的输出是将记录到日志中

#16


system.err打印错误信息

#17



要输出错误信息时当然是System.err好了,因为它会在前面加上[stderr]或者[err]的字样,这样比较醒目了,如果是System.out这般表示这个信息无关重要,可以不理会。看到[err]那当然得理会了1

#18


在linux/unix下你可以这样输出你的标准打印和标出错误 
file 1>prt.txt & 2>err.txt

#19


final和finalize的区别是什么?

#20


区别大了去了
一个是标识,一个是方法
final 是最终,不可变的意思
用在变量上就是表示,变量在初始化后,值就不可改
用在方法上就是表示,方法为叶方法,不可被子类重载
用在类上就是表示,类为叶类,不能再被继承了
而finalize   恩,怎么说呢,你就把它当成是C++的析构函数吧,只不过JAVA在执行后不会立刻就释放空间而已

#21


看了十楼的答案,很受教了,顶下~

#22


学习了

#23


受教了

#24


赞。。。

#25


标记一下、、、

#1


运行一下这个就知道了,原则上说System.err也可以重定向 ,但在web开发的时候,一般容器会把System.err和System.out重定向到不同的文件中,所以最好还是分开了好
//-------------------------
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class B {
  public static void main(String[] args) {
    try {
      System.setOut(new PrintStream(new FileOutputStream(new File("c:/test.txt"))));
      System.out.println("haha");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

#2


上面的代码只能说明 会存到不同文件中。
不能说明System.err比System.out要好

#3


我也不懂这里

#4


cxz7531(大花猫)  != 闭月羞花猫

#5


学习中

#6


学习了。

#7


不是谁好谁不好的问题. 而是要把一般信息和错误信息分开来比较好.
你要是高兴, 可以把错误用out输出, 一般信息用err输出. 只不过维护人员一定会想杀了你

#8


输入输出可以重定向,一般来讲System.out会经常被重定向,而System.err则不是经常被重定向
所以输出异常还是用err比较合适

#9


同意楼上看法....

#10


大多数操作系统都有三个标准文件描述符:标准输入,标准输出,标准出错。

三个操作系统的文件描述符映射到编程语言的标准库中,往往加了一层包装,但是名字通常还是叫标准输入,标准输出,标准出错。

在其它语言中的一般写法是:stdin,stdout,stderr(有的语言里大写,有的语言里小写)。对应Java中的System.in,System.out,System.err。

在语言层面的实现三个文件描述符都是可以重定向的(只要你想)。但是一般而言,如果你在unix shell或windows command line中使用管道或重定向,则只是针对标准输入和输出。

另外,标准输出和标准出错的一个区别是,标准输出往往是带缓存的,而标准出错没有缓存(默认设置,可以改)。所以如果你用标准出错打印出来的东西可以马上显示在屏幕,而标准输出打印出来的东西可能要再积累几个字符才能一起打印出来。如果你在应用中混用标准输出和标准出错就可能看到这个问题。

我的表达能力有限。总的来说,System.out用于正常的输出,也就是程序真正想输出的内容。而System.err用于出错信息的输出,也就是你本来不期待看到的东西。

#11


楼上,收下我吧!

#12


上上楼高

#13


8楼10楼都很强 :)
我从注释里抄的
/**
     * The "standard" output stream. This stream is already
     * open and ready to accept output data. Typically this stream
     * corresponds to display output or another output destination
     * specified by the host environment or user.
     * <p>
     * For simple stand-alone Java applications, a typical way to write
     * a line of output data is:
     * <blockquote><pre>
     *     System.out.println(data)
     * </pre></blockquote>
     * <p>
     * See the <code>println</code> methods in class <code>PrintStream</code>.
     *
     * @see     java.io.PrintStream#println()
     * @see     java.io.PrintStream#println(boolean)
     * @see     java.io.PrintStream#println(char)
     * @see     java.io.PrintStream#println(char[])
     * @see     java.io.PrintStream#println(double)
     * @see     java.io.PrintStream#println(float)
     * @see     java.io.PrintStream#println(int)
     * @see     java.io.PrintStream#println(long)
     * @see     java.io.PrintStream#println(java.lang.Object)
     * @see     java.io.PrintStream#println(java.lang.String)
     */
    public final static PrintStream out = nullPrintStream();

    /**
     * The "standard" error output stream. This stream is already
     * open and ready to accept output data.
     * <p>
     * Typically this stream corresponds to display output or another
     * output destination specified by the host environment or user. By
     * convention, this output stream is used to display error messages
     * or other information that should come to the immediate attention
     * of a user even if the principal output stream, the value of the
     * variable <code>out</code>, has been redirected to a file or other
     * destination that is typically not continuously monitored.
     */
    public final static PrintStream err = nullPrintStream();

#14


去看看Unix/Linux的输入、输出从定向就知道了

#15


System.err和System.out 就是错误输出和标准输出
如果你用LOG4J记录日志的话,且设定错误等级的话
System.err的输出是将记录到日志中

#16


system.err打印错误信息

#17



要输出错误信息时当然是System.err好了,因为它会在前面加上[stderr]或者[err]的字样,这样比较醒目了,如果是System.out这般表示这个信息无关重要,可以不理会。看到[err]那当然得理会了1

#18


在linux/unix下你可以这样输出你的标准打印和标出错误 
file 1>prt.txt & 2>err.txt

#19


final和finalize的区别是什么?

#20


区别大了去了
一个是标识,一个是方法
final 是最终,不可变的意思
用在变量上就是表示,变量在初始化后,值就不可改
用在方法上就是表示,方法为叶方法,不可被子类重载
用在类上就是表示,类为叶类,不能再被继承了
而finalize   恩,怎么说呢,你就把它当成是C++的析构函数吧,只不过JAVA在执行后不会立刻就释放空间而已

#21


看了十楼的答案,很受教了,顶下~

#22


学习了

#23


受教了

#24


赞。。。

#25


标记一下、、、