没有System.out怎么办,在控制台上打印?

时间:2012-11-01 07:33:36

标签: java io

我最近在接受采访时遇到了一个问题。问题陈述为 - >假设您无法访问Jdk API中的System类,也无法使用ECHO,您在JRE 5环境中,如何在控制台上打印任何内容?问题真正开始于 - 为什么Java给了我们PrintStream对象System.out ??为什么它是最终的?没有任何其他方法可以在控制台上打印任何东西。??

6 个答案:

答案 0 :(得分:13)

如果您愿意,可以绕过System对象。 System.out做了很多额外的事情(例如处理unicode),所以如果你真的只想要原始输出和性能,你实际上甚至可能绕过它。

import java.io.*;

public class PrintOutTest {
  public static void main(String args[]) throws IOException {
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new
      FileOutputStream(FileDescriptor.out), "ASCII"), 512);
    out.write("test string");
    out.write('\n');
    out.flush();
  }
}

here已经详细阐述了这一点。

答案 1 :(得分:4)

PrintStream是最终的,因为它可以完成Windows控制台/可以执行的所有操作。同样,“Console”是C#中的const类。这些类封装了控制台可以执行的所有操作,并且它以一种特定的方式执行 only 。你不能“让它变得更好”,因为在某种程度上,处理它是由操作系统决定的。

有很多方法可以在屏幕上输出内容:

  1. 以@eis的方式编写自己的OutputStream
  2. 使用JNI并调用本机DLL / SO中的方法,该方法调用printf()等本机函数
  3. 使用Runtime.getRuntime().exec()并致电echo计划 以下列表。
  4. +1到@eis

答案 2 :(得分:2)

您可以使用 JDK的记录器(java.util.logging.Logger)。

这是在java类中创建记录器的方法。

import java.util.logging.Logger;

private final static Logger LOGGER = Logger.getLogger(MyClass.class .getName()); 

此外,您可以将log4j用于相同目的。

答案 3 :(得分:2)

如上所述的面试问题是非常不正常的(即人为的),解决它涉及走出纯Java之外。这肯定不是你在正常情况下会考虑做的事情。

其他答案给了你一些半解决方案......如果你真的,真的必须这样做。 (我说半解决方案,因为他们大多不处理应用程序的stdout / stderr流被重定向到控制台以外的其他地方的情况。这是这个问题的唯一“真实”方面......)< / p>

如果你可以使用System类(在JDK 6上)...... 打印到控制台的干净方式(例如,如果System.out已经重定向)是使用System.console()方法获取Console对象,并使用它来获取Writer

但请注意,如果JVM没有关联的控制台,console()将返回null


  

问题真正开始于 - 为什么Java给了我们PrintStream对象System.out ??为什么它是最终的?没有任何其他方法可以在控制台上打印任何东西。??

答案是:

  1. 为方便起见。
  2. 因此,随机代码不会意外地破坏它。 (或者故意如果您需要担心在JVM中运行不受信任的代码。)但是,通过调用System.out,可信代码实际上可以更改System.setOut(...)。这有助于安全地改变final变量的状态。 (我相信JIT编译器已经意识到这一点,并以不同的方式处理这3个final变量。)
  3. 是。见上文,(哎呀!)其他答案。

答案 4 :(得分:1)

正如文件所述,

  

System类包含几个有用的类字段和方法。它   无法实例化。

因此,正如您所看到的,System类是不同有用函数的容器。所有这些字段和方法都是静态的,因此没有任何理由扩展它 Java给了我们static PrintStream out,因为它是与程序通信的默认方式 - 使用控制台 如果您不同意我的意见,请告诉我。

答案 5 :(得分:0)

我今天找到了解决问题的方法。 我正在使用org.apache.log4j来获得这个答案。这里有很多其他的方式。感谢。

UICollectionViewCell