Java 系统输出到底是什么?

Java 系统输出到底是什么?,java,jar,console,executable-jar,system.out,Java,Jar,Console,Executable Jar,System.out,我注意到,从命令行未启动的JAR文件(即用户双击启动的可运行JAR文件)调用System.out.println()都无法打开控制台 在做了一些研究之后,我在网站上找到了多个答案: 这样做没有问题但是您希望在哪里看到输出? 如果您以某种不附加控制台的方式运行代码,例如Windows上的javaw,这是与可执行jar文件关联的默认程序,那么输出将不会到达任何地方。它不会导致任何错误-文本将丢失 据我所知,System.out并不代表控制台。它确实表示任何需要显示它的东西都可以处理的数据

我注意到,从命令行未启动的JAR文件(即用户双击启动的可运行JAR文件)调用
System.out.println()
都无法打开控制台

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

  • 这样做没有问题但是您希望在哪里看到输出?

  • 如果您以某种不附加控制台的方式运行代码,例如Windows上的
    javaw
    ,这是与可执行jar文件关联的默认程序,那么输出将不会到达任何地方。它不会导致任何错误-文本将丢失

据我所知,
System.out
并不代表控制台。它确实表示任何需要显示它的东西都可以处理的数据。 我说得对吗

  • 什么是
    System.out
  • 如何从用户双击启动的可运行JAR文件打开控制台

系统
java.lang
包(java中的默认包)中的
最终
类,无法实例化

out
系统
类的
静态
成员字段,属于
打印流
类型,其访问说明符为
公共最终

println
–是
PrintStream
类的重载方法
println
打印传递到标准控制台的参数和换行符。存在多个具有不同参数的
println
重载方法。每个
println
调用print方法并添加一个换行符。在内部,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();
//...
}
因此,我们不需要实例化
系统
对象来将消息打印到屏幕上;我们只需在系统类的
publicstaticprintstream
成员
out
上调用
println
方法

但是不能创建
PrintStream
的对象并调用
println
函数。当您想要打印到标准输出时,您将使用
System.out
这是唯一的办法。实例化
PrintStream
将允许您写入指定的文件或输出流,但与控制台无关

但是,您可以将
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();
  }
}

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

现代操作系统中的进程(以及一些较旧的操作系统)得到三个与之相关联的标准“流”:

  • 标准输入:基于流的输入(
    stdin
  • 标准输出:基于流的输出(
    stdout
  • 标准错误:基于流的错误输出(
    stderr
整体上(创造性地)它们被称为

默认情况下,
System.in
System.out
System.err
是Java写入这些流的标准机制

从命令行调用的程序在以下环境中运行:
stdin
,并且
stdout
stderr
的输出在控制台中显示为文本。它们可以重定向到文件等

通过GUI启动的程序通常不会将这些流连接到您可以看到的任何内容

我在上面说“默认”,是因为您可以使用
System
上的调用来更改这些流指向的位置(它们有创造性的名称,如、和)

如何从用户双击启动的可运行JAR文件打开控制台

这里有一个错误的关联:jar是可运行的这一事实并不是您看不到流的原因。如果在命令行运行一个可运行的jar,您将看到它的标准输出


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

虽然它可能是正确的,但我的问题不是关于语法。我想知道这个班级的特点和他们背后的世界。检查我更新的答案,我希望它能解决你对这些特点的疑问。我建议你继续在
系统
课程中寻找更多答案。也许我应该说“目的”而不是“功能”。我不想知道Oracle开发人员是如何实现
System
类的,但是这些流是如何工作的。从命令行调用的程序是否重定向了流,因为控制台本身是一个应用程序,它启动那些使用普通Java process API的程序,像其他任何程序一样?@FrancescoMenzani:从命令行调用的程序通常没有重定向流。假设您执行
java-r runnable.jar
:操作系统运行
java
程序,为其提供标准流。
java
程序加载jar,并在新加载的JVM中为
System
设置流,以从操作系统读取并输出到它从操作系统获得的流。如果它们没有重定向流,那么控制台如何能够处理