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