Java中与系统无关的机器关机

Java中与系统无关的机器关机,java,platform-independent,system-shutdown,platform-independence,Java,Platform Independent,System Shutdown,Platform Independence,可能重复: 我正在制作一个个人程序,在一段时间后或在某个时间/日期关闭我的计算机。然而,我正在运行多个操作系统,并且希望用一个简单的Java程序来实现这一点有没有办法在不使用任何外部库的情况下用Java发送独立于系统的机器关机请求?我知道您可以使用Java.awt.Desktop.getDesktop().browse(新URI(“关机”)在Windows中,但我还是希望系统独立。不,没有 这超出了JVM或标准Java类库的范围 愉快的编码。为什么不使用调度程序?所有主要操作系统都支持这种功能

可能重复:

我正在制作一个个人程序,在一段时间后或在某个时间/日期关闭我的计算机。然而,我正在运行多个操作系统,并且希望用一个简单的Java程序来实现这一点有没有办法在不使用任何外部库的情况下用Java发送独立于系统的机器关机请求?我知道您可以使用
Java.awt.Desktop.getDesktop().browse(新URI(“关机”)在Windows中,但我还是希望系统独立。

不,没有

这超出了JVM或标准Java类库的范围


愉快的编码。

为什么不使用调度程序?所有主要操作系统都支持这种功能(cron、at等)。可能还有其他因素,如在现代windows(windows 7)、linux等系统中使用的权限


如果您想真正使用一些系统调用,请尝试使用。这大大简化了特定于平台的访问。

@robjb为我提供了最佳解决方案。虽然这对我的口味来说有点太死板了,但我会起诉它直到遇到问题

  String shutdownCommand;
  StringPP operatingSystem = new StringPP(System.getProperty("os.name"));

  if (operatingSystem.containsIgnoreCase("linux") ||
      operatingSystem.containsIgnoreCase("mac") ||
      operatingSystem.containsIgnoreCase("unix"))
  {
    shutdownCommand = "sudo shutdown -h -t 30";
  }
  else if (operatingSystem.containsIgnoreCase("windows"))
  {
    shutdownCommand = "shutdown /s /d P:0:0 /t 30 /c \"Blue Husky Timer 2 is shutting down your system, as you requested. \n"
        + "You have 30 seconds to save and close programs\"";
  }
  else
  {
    throw new UnsupportedOperationException("Unsupported operating system.");
  }

  try
  {
    Runtime.getRuntime().exec(shutdownCommand);
  }
  catch (Throwable t)
  {
    Main.LOG.logThrowable(t);
  }
  System.exit(0);

在上面的示例中,
StringPP
是一个自定义类,它使用上面使用的
#containsIgnoreCase
等方法来增强
String
的功能
Main.LOG
是我制作和使用的一个日志实用程序。

看看:当采用这种方法(这将是您唯一的选择)时,我建议直接使用
Runtime.exec()
而不是浏览桌面上看起来像命令行的某个url。使用“operatingSystem=System.getProperty(“os.name”)”的帖子根据结果,“Runtime.exec()”绝对是他的最佳选择。
System.exit(0)
关闭Java虚拟机,无论底层平台是什么。我最喜欢这篇文章。诚然,这篇文章不太实用,但它最接近于系统独立性。如果解释了原因,我会投票支持或接受这篇文章。就目前而言,这听起来像是一个短视的观点。对不起…@Supuhstar当然还有更多要说的:)JDK是一个通用库。我不知道任何语言的标准库都有系统关闭命令,这是操作系统的一项功能。这包括操作系统提供的许多系统调用(无论是Linux内核还是Windows和WinAPI)没有通过stdlib以任何方式公开。只有所有操作系统功能的子集作为POSIX API的一部分公开:我在“关闭计算机”上找不到。所以…你是说“java.awt.Toolkit#shutdown()“是否过于系统特定?为什么单个JVM不能处理实际的shutdown命令,而Java字节码仍然是一样的?@Supuhstar是的。我正是这样说的。请参阅上文。您可以隐藏特定于系统的行为(与接受的答案相同),但它不在标准库的范围内:尤其是Java的范围外,正如创建它的开发人员/设计人员明确指出的那样。@Supuhstar“这不在JVM或标准Java类库的范围内。”也就是说,JVM本质上没有允许它的部分,标准类库中也没有允许它的部分。AWT/Swing(或Android中使用的任何UI),考虑到它们是“标准”的,使用本机代码允许键盘/鼠标访问。这个答案是正确的。因为这个计划不仅仅是计划中的停机