我正在编写的Android应用程序有两个问题.
我正在从/ proc / net / arp中读出本地arp表,并在哈希映射中保存ip和相应的mac地址.看我的功能.它运作正常.
/**
* Extract and save ip and corresponding MAC address from arp table in HashMap
*/
public Map createArpMap() throws IOException {
checkMapARP.clear();
BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
String line = "";
while ((line = localBufferdReader.readLine()) != null) {
String[] ipmac = line.split("[ ]+");
if (!ipmac[0].matches("IP")) {
String ip = ipmac[0];
String mac = ipmac[3];
if (!checkMapARP.containsKey(ip)) {
checkMapARP.put(ip, mac);
}
}
}
return Collections.unmodifiableMap(checkMapARP);
}
>第一个问题:
我也在使用广播接收器.当我的应用程序收到状态WifiManager.NETWORK_STATE_CHANGED_ACTION时,我检查是否建立了与网关的连接.如果为true,我调用我的函数来读取arp表.但是在这个阶段,系统还没有构建arp表.有时当我收到连接状态时,arp表是空的.
有人有想法解决这个问题吗?
>第二个问题:
我想以持久的方式保存网关的ip和mac地址.现在我正在使用Shared Preferences.也许写入内部存储更好?
有小费吗?
解决方法:
对于第一个问题,您可以在睡眠一段时间之后启动一个运行该方法的新线程,或者直到它有一些条目(使用邮箱创建Runnable以获取Map) – 除非您需要直接使用地图,那么我认为唯一的方法是等待参赛作品.例如(如果您需要直接使用地图):
public Map createArpMap() throws IOException {
checkMapARP.clear();
BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
String line = "";
while ((line = localBufferdReader.readLine()) == null) {
localBufferdReader.close();
Thread.sleep(1000);
localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
}
do {
String[] ipmac = line.split("[ ]+");
if (!ipmac[0].matches("IP")) {
String ip = ipmac[0];
String mac = ipmac[3];
if (!checkMapARP.containsKey(ip)) {
checkMapARP.put(ip, mac);
}
}
} while ((line = localBufferdReader.readLine()) != null);
return Collections.unmodifiableMap(checkMapARP);
}
标签:java,android
来源: https://codeday.me/bug/20190709/1412401.html