Как конвертировать ARP-код JAVA в Kotlin в Android
Я пытаюсь получить все Mac и IP с моего Android с помощью следующего кода. Но следующий код работает только в Java. Я хочу использовать его в kotlin, поэтому я попробовал конвертер java в kotlin. Но это не сработало. Может ли кто-нибудь сказать мне, как следующая часть кода будет использоваться в Kotlin:
listNote.clear();
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4) {
String ip = splitted[0];
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
Node thisNode = new Node(ip, mac);
listNote.add(thisNode);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
1 ответ
Автоматическое преобразование не обрабатывает ваш цикл while, так как "назначения не являются выражением".
Вы можете обойти это, используя встроенную функцию расширения Readers forEachLine
, в этом случае каждая строка передается как единственный аргумент лямбда-выражения как it
:
var bufferedReader: BufferedReader? = null
try {
bufferedReader = BufferedReader(FileReader("/proc/net/arp"))
bufferedReader.forEachLine {
val splitted = it.split(" +".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
if (splitted.size >= 4) {
val ip = splitted[0]
val mac = splitted[3]
if (mac.matches("..:..:..:..:..:..".toRegex())) {
listNote.add(Node(ip, mac))
}
}
}
} catch (e: IOException) {
e.printStackTrace()
} finally {
try {
bufferedReader?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
Вы также можете удалить FileNotFoundException
так как это подкласс IOException
и блок catch одинаков.