Перейти к содержанию

🗒 Задача

В курсовой работе мы разрабатываем телеграм-бота на Kotlin, который помогает пользователям учить иностранные слова. Создай extension функцию для класса File из стандартной библиотеки, которая будет записывать переданное ей слово в файл.

  • дополнительные материалы про файлы есть в 1-2 этапах курсовой;

  • функция-расширение должна записывать текст в нижнем регистре;

  • функция-расширение должна записывать текст в начало файла.

❌ Ошибки

✏️ Комментарии

Понимаю, что очень не очень метод, читать файл в буфер, перезаписывать файл новой строкой, добавляя содержимое буфера к новой строке, мб, с маленьким файлом еще ок, но на большом файле способ по идее загнется, но я долго думал и искал метод, позволяющий перевести каретку в начало файла для записи или что-то подобное сделать но так и не нашел способ избежать метод перезаписи файла.

Круто что мыслишь в этом направлении, возможно первый из студентов кто задумался о памяти 👍
Но раз ты напрашиваешься, давай попробуем порешать :)
Давай создадим большой файл:


    val file = File("big.txt")

    if (!file.exists()) {
        val bytes = (0..10_000_000).map { it.toByte() }.toByteArray()
        (0..1000).forEach { _ ->
            file.appendBytes(bytes)
        }
    }


Попробуй свой метод на нем. Должно упасть из-за нехватки Heap.
Чтобы такого не было, нужно использовать небольшой буфер.
Попробуй решить задачу при помощи `RandomAccessFile("big.txt", "rw")`
Но это факультативно, можешь ограничится правками в комментах.
ps: Сразу скажу - я за пол часика не решил :)

🧾 Решение

fun File.prependWord(word: String) {
    val content = this.readText()
    this.writeText(word.toLowerCase() + "\n" + content)
}

fun main() {
    val file = File("words.txt")
    file.prependWord("NewWord")
}
fun File.saveTextToFile(text: String) {
    this.createNewFile()
    this.writeText(text.lowercase() + this.readText())
}

fun main() {
    val file = File("word.txt")
    file.saveTextToFile("Слово1")
    println(file.readText())
    file.saveTextToFile("Слово2")
    println(file.readText())
}