Как конвертировать 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 одинаков.

Другие вопросы по тегам