Как преобразовать этот код Java в Kotlin для Android Studio для извлечения данных из файла? - PullRequest
0 голосов
/ 06 ноября 2019

Я искал, как получить файл в Kotlin, и я нашел этот код в Java.

public void load(View v) {
    FileInputStream fis = null;

    try {
        fis = openFileInput(FILE_NAME);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);
        StringBuilder sb = new StringBuilder();
        String text;

        while ((text = br.readLine()) != null) {
            sb.append(text).append("\n");
        }

        mEditText.setText(sb.toString());

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Как написать это на Kotlin Language ...? До сих пор я пытался преобразовать его в Kotlin, но в некоторых строках все еще есть ошибки (обозначено). Пожалуйста, помогите мне в решении этих ошибок.

var fis = File(FILE_NAME).inputStream     //<ror>Unresolved reference File 
try {
    fis = openFileInput(FILE_NAME)
    var isr = InputStreamReader(fis)
    val br = BufferedReader(isr)
    val sb = StringBuilder()
    var text:List<String> = br.readLines()

    while ((text) != null) {                //<ror>
        sb.append(text).append("\n")
    }

    mEditText?.text(sb.toString())          //<ror>

} catch (e : FileNotFoundException) {
    e.printStackTrace()
} catch (e : IOException) {
    e.printStackTrace()
} finally {
    if (fis != null) {
        try {
            fis.close()
        } catch (e : IOException) {
            e.printStackTrace()
        }
    }
}

Ответы [ 6 ]

1 голос
/ 06 ноября 2019
File(FILE_NAME).readLines().fold(StringBuilder()){ builder, next ->
   builder.appendln(next)
}.also {
   mEditText.setText(it.toString())
}

0 голосов
/ 06 ноября 2019
fun void load(v: View) {
    try {
        openFileInput(FILE_NAME).use { fis ->
            val br = BufferedReader(InputStreamReader(fis))

            var text: String? = null

            while(true) {
                text = br.readLine() ?: break
                sb.append(text).append("\n")
            }

            editText.setText(sb.toString())
        }
    } catch(e: Exception) {
        e.printStackTrace()
    }
}

Это должно быть разумно эквивалентно. Обратите внимание, что if((text = br.readLine() != null) { не может быть написано так же, как непосредственно в Kotlin, однако вы можете заменить его на while(true) { break;.

Manual close() не требуется, если вы используете .use {.

0 голосов
/ 06 ноября 2019

Вот мое решение:

fun load(v: View?) {
    var fis: FileInputStream? = null

    try {
        fis = openFileInput(FILE_NAME)
        val isr = InputStreamReader(fis)
        val br = BufferedReader(isr)
        val lines = br.readLines()
        val output = lines.joinToString("\n")

        mEditText.setText(output)
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        try {
            fis?.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}
0 голосов
/ 06 ноября 2019

Мое решение:

var fis = File(FILE_NAME).inputStream()                             

    try {
        fis = openFileInput(FILE_NAME)
        val isr = InputStreamReader(fis)
        val br = BufferedReader(isr)
        val sb = StringBuilder()
        var lines = br.readLines()

        for (line in lines) {                                       
            sb.append(line).append("\n")
        }

        mEditText?.setText(sb.toString())                           

    } catch (e : FileNotFoundException) {
        e.printStackTrace()
    } catch (e : IOException) {
        e.printStackTrace()
    } finally {
        try {
            fis.close()
        } catch (e : IOException) {
            e.printStackTrace()
        }

    }

Похоже, у вас там бесконечный цикл, поэтому я изменяю его на каждый цикл для чтения всех строк из InputStream

0 голосов
/ 06 ноября 2019

Просто вставьте свой Java-код в Android Studio .kt файл, он предложит вам конвертировать его в Kotlin. Там вы получаете 99% кода котлина. Затем измените некоторые недостающие элементы.

0 голосов
/ 06 ноября 2019

Попробуйте код ниже

fun load(v: View, fileName: String ) {
        var fis = File(fileName).inputStream()                             

        try {
            fis = openFileInput(fileName)
            var isr = InputStreamReader(fis)
            val br = BufferedReader(isr)
            val sb = StringBuilder()
            var text:List<String> = br.readLines() //Do not use this function for huge files.

            while (true) {                                      
                sb.append(text).append("\n")
            }

            mEditText?.text(sb.toString())       //mEditText is your EditText                          

        } catch (e : FileNotFoundException) {
            e.printStackTrace()
        } catch (e : IOException) {
            e.printStackTrace()
        } finally {
            try {
                fis.close()
            } catch (e : IOException) {
                e.printStackTrace()
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...