Java 中检测 Apple Silicon (M1) 与 Intel 处理器

Java 中检测 Apple Silicon (M1) 与 Intel 处理器 在 Java 在应用程序中直接通过 System.getProperty(os.arch) 获得的架构信息可能无法准确反映底层硬件的真实架构。特别是在安装不同架构时 JRE 时os.arch 返回的是 JRE 架构而不是操作系统或硬件架构。因此为了准确检测 Apple Silicon (M1) 或 Intel 在操作系统提供的机制的帮助下处理器。Windows 系统在 Windows 在系统上您可以通过阅读来命名它 PROCESSOR_IDENTIFIER 获取处理器的详细信息的环境变量。可以使用 System.getenv() 访问此环境变量的方法。String processorIdentifier System.getenv(PROCESSOR_IDENTIFIER); System.out.println(processorIdentifier);该代码将打印包含处理器型号和制造商信息的字符串例如 Intel64 Family 6 Model 158 Stepping 11, GenuineIntel。macOS 系统在 macOS 可以在系统上使用 sysctl 命令来获取 CPU 品牌字符串。这可以通过 ProcessBuilder 类来实现。立即学习“Java免费学习笔记(深入)ProcessBuilder pb new ProcessBuilder(sysctl, -n, machdep.cpu.brand_string); String cpuBrandString null; try { Process p pb.start(); BufferedReader br p.inputReader(); cpuBrandString br.readLine(); int status p.waitFor(); if (status ! 0) { System.err.println(sysctl command failed with status: status); } } catch (InterruptedException | IOException x) { x.printStackTrace(); } System.out.println(cpuBrandString);该代码将执行 sysctl -n machdep.cpu.brand_string 命令并读取输出结果包括 CPU 品牌字符串。 对于 Apple Silicon 芯片的输出可能类似 Apple M1。完整示例下面是一个完整的例子展示了如何处理它。 Java 中检测 Apple Silicon 或 Intel 根据检测结果对处理器进行不同的操作。public class ArchitectureDetector { public static void main(String[] args) { String osName System.getProperty(os.name); String processorDetails null; if (osName.startsWith(Windows)) { processorDetails System.getenv(PROCESSOR_IDENTIFIER); } else if (osName.startsWith(Mac OS X)) { ProcessBuilder pb new ProcessBuilder(sysctl, -n, machdep.cpu.brand_string); try { Process p pb.start(); BufferedReader br new BufferedReader(p.inputReader()); processorDetails br.readLine(); int status p.waitFor(); if (status ! 0) { System.err.println(sysctl command failed with status: status); } } catch (InterruptedException | IOException x) { x.printStackTrace(); } } if (processorDetails ! null) { if (processorDetails.contains(Apple)) { System.out.println(Detected Apple Silicon processor.); // 执行 Apple Silicon 相关的操作 } else if (processorDetails.contains(Intel)) { System.out.println(Detected Intel processor.); // 执行 Intel 相关的操作 } else { System.out.println(Processor details: processorDetails); // 处理其他情况 } } else { System.out.println(Could not determine processor architecture.); } } }注意事项权限问题: 在某些操作系统中执行外部命令可能需要特定的权限。请确保 Java 执行应用程序 sysctl 命令的权限。异常处理: 为了防止程序崩溃在执行外部命令时必须进行适当的异常处理。操作系统兼容性 PROCESSOR_IDENTIFIER 环境变量和 sysctl 所有的命令都特定在操作系统中。此代码可能需要在其他操作系统上进行修改。字符串匹配 processorDetails.contains(Apple) 这种简单的字符串匹配方法可能不够准确。 更复杂的模式可以根据实际情况进行匹配。JDK 版本: 确保使用的 JDK 版本支持 ProcessBuilder 和 BufferedReader 类。总结可以通过操作系统提供的特定方式进行操作 Java 在应用程序中准确检测 Apple Silicon (M1) 和 Intel 处理器。 在 Windows 可用于系统 PROCESSOR_IDENTIFIER 环境变量而在 macOS 可用于系统 sysctl 命令。 考虑到操作系统的兼容性必须进行适当的异常处理。 这样可以根据不同的处理器架构进行不同的操作从而优化应用程序的性能和兼容性。