我注意到,从命令行未启动的JAR文件中调用System.out.println()
(即用户双击启动的Runnable JAR文件)将无法打开控制台。 / p>
在做了一些研究之后,我在网站上找到了多个答案:
这样做没有问题。 但您希望在哪里看到输出?
What happens to “System.out.println()” in executable jar?
如果以某种方式运行代码但没有附加控制台 - 例如Windows上的
javaw
,这是与可执行jar文件关联的默认程序 - 那么输出将不会任何地方即可。它不会导致任何错误 - 文本将丢失。
据我了解,System.out
并不代表控制台。它确实代表了可以由需要显示它的任何东西处理的数据。
我是对的吗?
System.out
?答案 0 :(得分:4)
现代操作系统(以及几个较旧的操作系统)中的流程可以获得三个标准的"流"与他们相关:
stdin
)stdout
)stderr
)他们共同(并且创造性地)称之为standard streams。
默认情况下, System.in
,System.out
和System.err
是Java用于写入这些流的标准机制。
从命令行调用的程序在命令行中的击键转到stdin
的环境中运行,stdout
和stderr
的输出在控制台中显示为文本。它们可以重定向到文件等。
通过GUI启动的程序经常不会将这些流挂钩到你能看到的任何内容。
我说"默认情况下#34;以上是因为您可以使用System
上的来电来更改这些流指向的位置(它们具有setIn
,setOut
和setErr
等广告素材。)
如何通过双击?
从用户启动的Runnable JAR文件中打开控制台
那里存在错误的相关性:罐子可以运行的事实并不是你不能看到溪流的原因。如果在命令行运行可运行的jar,则会看到其标准输出。
如果您在没有与某种控制台关联的情况下运行它,您是否可以看到该输出将取决于您如何运行它以及可能的编写方式。许多GUI框架将标准输出重定向并将错误重定向到日志文件。或者应用程序可能提供这样做的调试选项。那里没有标准答案(没有双关语)。
答案 1 :(得分:3)
此处,System.out
代表输出流 - 您的输出将在哪里。默认情况下,它设置为控制台。但您可以将其更改为其他类似的 - 文本文件。大多数情况下,在大型应用程序中,它用于日志记录(通常由新程序员,坏主意)。在这种情况下,您可以在适当的日志文件中看到输出。
答案 2 :(得分:0)
System
是来自final
包的java.lang
类(java中的默认包),无法实例化。
out
是static
类的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();
}
}