我最近在接受采访时遇到了一个问题。问题陈述为 - >假设您无法访问Jdk API中的System类,也无法使用ECHO,您在JRE 5环境中,如何在控制台上打印任何内容?问题真正开始于 - 为什么Java给了我们PrintStream对象System.out ??为什么它是最终的?没有任何其他方法可以在控制台上打印任何东西。??
答案 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 。你不能“让它变得更好”,因为在某种程度上,处理它是由操作系统决定的。
有很多方法可以在屏幕上输出内容:
printf()
等本机函数Runtime.getRuntime().exec()
并致电echo
计划
以下列表。 +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 ??为什么它是最终的?没有任何其他方法可以在控制台上打印任何东西。??
答案是:
System.out
,可信代码实际上可以更改System.setOut(...)
。这有助于安全地改变final
变量的状态。 (我相信JIT编译器已经意识到这一点,并以不同的方式处理这3个final
变量。)答案 4 :(得分:1)
正如文件所述,
System类包含几个有用的类字段和方法。它 无法实例化。
因此,正如您所看到的,System类是不同有用函数的容器。所有这些字段和方法都是静态的,因此没有任何理由扩展它
Java给了我们static PrintStream out
,因为它是与程序通信的默认方式 - 使用控制台
如果您不同意我的意见,请告诉我。
答案 5 :(得分:0)
我今天找到了解决问题的方法。 我正在使用org.apache.log4j来获得这个答案。这里有很多其他的方式。感谢。
UICollectionViewCell