我正在尝试编写一个程序来监视各种硬件组件的温度。
我选择的语言是Java。现在有两种方法可以读取温度:
a)cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input
用Java做一个Process process = Runtime.getRuntime().exec("cat /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input");
b) 创建一个File
指向/sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input
并打开BufferedReader
该文件以读取温度
第一个看起来很奇怪,当您实际上已经准备好知道文件所在位置时,您调用另一个程序来读取文件并打印内容。
第二个让我思考,当 Linux 内核每秒更新该文件并且我将尝试BufferedReader
每 7 秒打开一个文件时,会导致任何问题吗?
寻找这些方法中哪种更聪明的见解。
答案1
出于性能和可移植性原因(见下文),选项 B 是首选解决方案,我可能会立即读取文件的全部内容
字符串内容 = new Scanner(new File(“文件名”)).useDelimiter(“\Z”).next();
(由此堆栈溢出答案)
您应该处理由文件不存在引起的 I/O 错误,并在文件为零字节时读取它(当 hwmon 在将新值写入文件之前截断文件时可能会发生这种情况,而这是很短的时间发生)。
选项 A 最终创建了 2 个子进程 - 第一个它创建一个 shell,然后将命令行传递给该进程,该进程启动您所期望的 cat 命令。如果运行程序的进程有一个奇怪的路径环境变量,它可能无法运行 cat,或者运行一些你不期望的东西。这可以通过使用完整路径(通常为 /bin/cat)来缓解,这仍然取决于系统。
总的来说,除非别无选择,否则最好不要生成外部进程。