我正在使用
Runtime.exec("sudo hcitool lescan --passive");
代码但是sudo hcitool lescan命令没有终止,因此Runtime.exec
无法完成。
我还使用sudo timeout 10s hcitool lescan --passive
命令完成但无法使用java code import java.io.*;
上的MAC地址进行处理
我使用了这段代码
public class scan{
public static void main(String args[]){
String s = null;
try {
Process p = Runtime.getRuntime().exec("sudo hcitool lescan --passive");
p.waitFor();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
System.out.println("result");
while((s=stdInput.readLine())!=null){
System.out.println(s);
}
while((s=stdError.readLine())!=null){
System.out.println(s);
}
System.exit(0);
}
catch (IOException e){
e.printStackTrace();
System.exit(-1);
}
}
}
我希望将Beacon的MAC地址变为字符串。
我该怎么办?帮助我,谢谢。
答案 0 :(得分:0)
多线程对我有用:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class LoopTest {
class Cmd extends Thread
{
public Process p = null;
public void run()
{
try {
p = Runtime.getRuntime().exec("cmd");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
p.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[]){
String s = null;
try {
Cmd cmd=new LoopTest().new Cmd();
ExecutorService es=Executors.newCachedThreadPool();
es.submit(cmd);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader stdInput = new BufferedReader(new InputStreamReader(cmd.p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(cmd.p.getErrorStream()));
System.out.println("result");
while((s=stdInput.readLine())!=null){
System.out.println(s);
}
while((s=stdError.readLine())!=null){
System.out.println(s);
}
System.exit(0);
}
catch (IOException e){
e.printStackTrace();
System.exit(-1);
}
}
}
用于Windows的cmd命令也会阻塞,但另一个线程可以读取它。
result
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. T?m haklar? sakl?d?r.
而不是Thread.sleep(2000);
,您可以在使用之前检查p
是否已初始化。