1

我朋友问了一个问题

Why Java doesn't support function like clrscr in C?

SO的用户给出的答案是

John3136因为 Java 是跨平台的,并且可以在没有控制台的情况下运行,所以 clrscr 的含义必须根据应用程序的运行方式和平台而改变。

mvp: Java 被设计为一次编写/编译,在任何地方运行。而这个功能不太适合这个议程。

我的问题是这不是 JVM 处理的跨平台差异吗?那么像Thread.sleep()System.out.println()这样的函数将如何工作?它们还依赖于底层平台,比如线程在 Linux 和 Windows 中的实现[可能]不同?

我主要担心的是,如果像 System.out.println() 这样的函数在不同的平台上工作,那么也可以为不同的平台实现 clrscr。我对约翰和 mvp 的回答有点怀疑

4

3 回答 3

1

问题是一个可靠的实现clrscr需要库方法知道它连接到什么样的设备......这样它就可以做适当的事情来清除屏幕。库可能知道如何在 Windows 上执行此操作,但不能在所有平台上执行此操作。

一般的理念是,如果某些功能不能在所有支持的平台上实现,那么标准 Java 类将不支持它。

但是,这并不意味着您不能实现自己的库来clrscr自己做......在弄清楚如何在所有对您重要的平台上做到这一点之后。或者您可以找到合适的 3rd-party 库。您冒着使您的应用程序不可移植的风险,但这是您所关心的。

另一种解释是 Java SE 库不为老式终端/终端仿真器提供任何支持。(相当于旧的“termcap”库。)为什么?因为在这些带有图形屏幕的计算机和电话的时代,很少有人需要它。(我不记得我上一次使用真正的 24x80 终端是什么时候了……但那可能是 25 多年前了!)


我对约翰和 mvp 的回答有点怀疑:

很难解决你的怀疑。也许唯一能让您信服的事情就是让您尝试clrscr在各种平台和输出设备上自己用 Java 实现......

那么像 Thread.sleep() 和 System.out.println() 这样的函数将如何工作?

所有操作系统(或至少所有能够支持 Java 的操作系统)都提供具有所需功能的本机 API/库。

  • 在 的情况下Thread.sleep,JVM 实现通常使用 POSIXsleep(...)函数。

  • System.out.println,out是 a的情况下, PrintWriterJVM 创建一个PrintWriter连接到标准输出设备的 a。该println调用很可能导致调用 POSIXwrite函数。

情况并非如此clrscr。C 标准库不支持此功能。

于 2013-07-14T06:14:01.097 回答
1

System.out.println使用标准输出流,它可以是控制台或其他东西(例如你的 IDE 的输出窗口)。

可以访问控制台本身,正如文档System.console()所指出的那样,它可以返回 null。在那种情况下,不清楚应该做什么。clrscr

于 2013-07-14T05:40:59.700 回答
0

如您引用的问题中所述,C 不支持 clrscr 作为标准功能。由于正在清除控制台,这意味着存在允许执行此操作的 OS 系统调用。假设不是所有的操作系​​统都实现了这个系统调用,那么根本不可能用 Java 或实际上用任何其他语言作为标准特性来实现它。

于 2013-07-14T05:43:59.613 回答