什么是System.out?

时间:2015-08-29 15:45:28

标签: java jar console executable-jar system.out

我注意到,从命令行未启动的JAR文件中调用System.out.println()(即用户双击启动的Runnable JAR文件)将无法打开控制台。 / p>

在做了一些研究之后,我在网站上找到了多个答案:

据我了解,System.out并不代表控制台。它确实代表了可以由需要显示它的任何东西处理的数据。 我是对的吗?

  • 究竟是什么System.out
  • 如何通过双击?
  • 从用户启动的Runnable JAR文件中打开控制台

3 个答案:

答案 0 :(得分:4)

现代操作系统(以及几个较旧的操作系统)中的流程可以获得三个标准的"流"与他们相关:

  • 标准输入:基于流的输入(stdin
  • 标准输出:基于流的输出(stdout
  • 标准错误:基于流的错误输出(stderr

他们共同(并且创造性地)称之为standard streams

默认情况下,

System.inSystem.outSystem.err是Java用于写入这些流的标准机制。

从命令行调用的程序在命令行中的击键转到stdin的环境中运行,stdoutstderr的输出在控制台中显示为文本。它们可以重定向到文件等。

通过GUI启动的程序经常不会将这些流挂钩到你能看到的任何内容。

我说"默认情况下#34;以上是因为您可以使用System上的来电来更改这些流指向的位置(它们具有setInsetOutsetErr等广告素材。)

  

如何通过双击?

从用户启动的Runnable JAR文件中打开控制台

那里存在错误的相关性:罐子可以运行的事实并不是你不能看到溪流的原因。如果在命令行运行可运行的jar,则会看到其标准输出。

如果您在没有与某种控制台关联的情况下运行它,您是否可以看到该输出将取决于您如何运行它以及可能的编写方式。许多GUI框架将标准输出重定向并将错误重定向到日志文件。或者应用程序可能提供这样做的调试选项。那里没有标准答案(没有双关语)。

答案 1 :(得分:3)

此处,System.out代表输出流 - 您的输出将在哪里。默认情况下,它设置为控制台。但您可以将其更改为其他类似的 - 文本文件。大多数情况下,在大型应用程序中,它用于日志记录(通常由新程序员,坏主意)。在这种情况下,您可以在适当的日志文件中看到输出。

答案 2 :(得分:0)

System是来自final包的java.lang类(java中的默认包),无法实例化。

outstatic类的System成员字段,类型为PrintStream,其访问说明符为public final

println - 是PrintStream类的重载方法。 println打印传递给标准控制台和换行符的参数。有多个println重载方法具有不同的参数。每个println都会调用print方法并添加换行符。在内部,打印调用write()write()负责将数据显示到标准输出窗口。

这是它应该在内部看起来的样子:

//the System class belongs to java.lang package
class System {
  public static final PrintStream out;
  //...
}

//the Prinstream class belongs to java.io package
class PrintStream{
public void println();
//...
}

因此,我们不需要实例化System对象来将消息打印到屏幕上;我们只需在System类的println成员public static PrintStream上调用out方法。

但是您无法创建PrintStream的对象并调用println函数。如果要打印到标准输出,则使用System.out这是唯一的方法。实例化PrintStream将允许您写入您指定的文件或OutputStream,但与控制台没有任何关系。

但是,您可以将System.out传递给PrintStream,然后在PrintStream对象上调用println以打印到标准输出。这是一个小例子:

import java.io.*;
public class SystemOutPrintlnDemo
{
  public static void main(String[] args) 
  {
    //creating PrintStream object
    PrintStream ps = new PrintStream(System.out);
    ps.println("Hello World!");
    ps.print("Hello World Again!");
    //Flushes the stream
    ps.flush();
  }
}