Ale*_*mek 5 java unix io macos
我想在java程序中打印我的mac [编辑:Apple计算机]序列号.我熟悉Unix命令
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
Run Code Online (Sandbox Code Playgroud)
这在终端完成了这项任务.
当我尝试
String command = "ioreg -l | awk '/IOPlatformSerialNumber/ { print $4; }'"
Runtime terminal = Runtime.getRuntime();
String input = new BufferedReader(
new InputStreamReader(
terminal.exec(commands).getInputStream())).readLine();
System.out.println(new BufferedReader(
new InputStreamReader(
terminal.exec(command, args).getInputStream())).readLine());
Run Code Online (Sandbox Code Playgroud)
我的序列号没有打印出来.相反它打印:
<+-o Root class IORegistryEntry, id 0x100000100, retain 10>
Run Code Online (Sandbox Code Playgroud)
我认为问题在于terminal.exec()并不是要占用整个命令字符串.java中的某些东西是否类似于shell = Truepython中的参数,Popen(command, stdout=PIPE, shell=True)它允许我传递整个命令字符串?
我看到两种可能性:
解析ioreg -l使用扫描仪的输出.
将命令包装在shell脚本中并且exec():
#!/bin/sh
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
附录:作为使用的一个例子ProcessBuilder,并结合Paul Cager的有用建议,这是第三种选择:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class PBTest {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("bash", "-c",
"ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'");
pb.redirectErrorStream(true);
try {
Process p = pb.start();
String s;
// read from the process's combined stdout & stderr
BufferedReader stdout = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = stdout.readLine()) != null) {
System.out.println(s);
}
System.out.println("Exit value: " + p.waitFor());
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
要通过 Java 获取 MAC 地址,您可以使用java.net.NetworkInterface:
NetworkInterface.getByName("xxx").getHardwareAddress()
Run Code Online (Sandbox Code Playgroud)
如果您不知道网络接口的名称(我假设它在 Linux 上是“eth0”),您甚至可以使用NetworkInterface.getNetworkInterfaces().
| 归档时间: |
|
| 查看次数: |
5714 次 |
| 最近记录: |