如何在Android中将JAVA的ARP代码转换为Kotlin

时间:2018-06-23 18:14:04

标签: java android kotlin arp

我正在尝试使用以下代码从我的android获取所有的mac和IP。但是以下代码仅适用于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 个答案:

答案 0 :(得分:1)

由于“分配不是表达式”,因此自动转换无法处理while循环。

您可以使用内置的Readers扩展功能forEachLine来解决此问题,在这种情况下,每一行作为lambda表达式的唯一参数传递为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块相同。