Kotlin->Kotlin文件读写

本文详细比较了Kotlin中使用File方式、字节流(FileInputStream,BufferedInputStream)、字符流(FileReader,BufferedReader)读取和写入大文件的性能问题,以及如何通过缓冲减少阻塞和提高CPU效率。
摘要由CSDN通过智能技术生成

在这里插入图片描述

Kotlin读文件

  • File方式,一次性读取文件,大文件时阻塞时间长,CPU使用率高
val filePath = "D:\\Users\\yang.guo\\Downloads\\yang.txt"
val file : File = File(filePath)
// 一次性读取文件内容
val fileContent : String = file.readText().apply { println(this) }
// 逐行读取文件内容
val fileContentList : List<String> = file.readLines()
fileContentList.forEach { println(it) }
// 读取文件内容到ByteArray, 再用ByteArray恢复文件
val fileByteArray = file.readBytes()
val fileContentFromByte = String(fileByteArray).apply { println(this) }

// 三种方式log result
guo
/ ***/
never
  • 字节流方式
var fis: FileInputStream? = null
try {
   fis = FileInputStream(File(filePath))
   val EOF = -1 // End Of File
   val buffer = ByteArray(1024 * 8) // 缓冲区大小
   var count = 0
   while (true) {
       count = fis.read(buffer) // 文件内容读取到buffer中, count为读取的字节数
       if (count == EOF) break else {
           println(String(buffer, 0, count))
       }
   }
} catch (e: Exception) {
   println(e)
} finally {
   fis?.close()
}

var bis : BufferedInputStream ?= null
try {
    bis = BufferedInputStream(FileInputStream(File(filePath)))
    val EOF = -1 // End Of File
    val buffer = ByteArray(1024 * 8) // 缓冲区大小
    var count = 0
    while (true) {
        count = bis.read(buffer) // 从BufferedInputStream的内部缓存区读取到buffer中, count为读取的字节数
        if (count == EOF) break else {
            println(String(buffer, 0, count))
        }
    }
}catch (e: Exception) {
    println(e)
}finally {
    bis?.close()
}

// 两种方式log result
guo
/ ***/
never
  • 字符流方式
var fr: FileReader? = null
try {
    fr = FileReader(File(filePath))
    val buffer = CharArray(1024 * 8) // 缓冲区大小
    var count = 0
    while (true) {
        count = fr.read(buffer) // 文件内容读取到buffer中, count为读取的字符数
        if (count == -1) break else {
            println(String(buffer, 0, count))
        }
    }
} catch (e: Exception) {
    println(e)
} finally {
    fr?.close()
}

var br: BufferedReader? = null
try {
    br = BufferedReader(FileReader(File(filePath)))
    val buffer = CharArray(1024 * 8) // 缓冲区大小
    var count = 0
    while (true) {
        count = br.read(buffer) // 从BufferedReader的内部缓存区读取到buffer中, count为读取的字符数
        if (count == -1) break else {
            println(String(buffer, 0, count))
        }
    }
} catch (e: Exception) {
    println(e)
} finally {
    br?.close()
}
// 两种方式log result
guo
/ ***/
never

Kotlin写文件

  • File方式,一次性读取文件,大文件时阻塞时间长,CPU使用率高
val file = File(filePath)
file.writeText("ride") // 会覆盖
file.appendText("bike") // 追加不会覆盖
file.appendBytes("2024 year".toByteArray()) // 追加不会覆盖
  • 字节流方式
var fos : FileOutputStream ?= null
try {
    fos = FileOutputStream(File(filePath))
    val buffer = ByteArray(1024 * 8) // 缓冲区大小
    // 将buffer中的数据写入文件,方法会覆盖文件的内容。如果文件不存在,这个方法会创建一个新的文件
    fos.write(buffer)
}catch (e: Exception) {
    println(e)
}finally {
    fos?.close()
}

var bos : BufferedOutputStream ?= null
try {
    bos = BufferedOutputStream(FileOutputStream(File(filePath)))
    val buffer = ByteArray(1024 * 8) // 缓冲区大小
    // 将buffer中的数据写入到BufferedOutputStream的内部缓冲区,内部缓冲区再一次性写入文件
    bos.write(buffer)
}catch (e: Exception) {
    println(e)
}finally {
    fos?.close()
}
  • 字符流方式
var fw: FileWriter? = null
try {
    fw = FileWriter(File(filePath))
    val buffer = CharArray(1024 * 8) // 缓冲区大小
    fw.write(buffer)
} catch (e: Exception) {
    println(e)
} finally {
    fw?.close()
}

var bw: BufferedWriter? = null
try {
    bw = BufferedWriter(FileWriter(File(filePath)))
    val buffer = CharArray(1024 * 8)
    // 将buffer中的数据写入到BufferedWriter的内部缓冲区,缓冲区再一次性写入文件
    bw.write(buffer)
} catch (e: Exception) {
    println(e)
} finally {
    bw?.close()
}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kotlin 中使用序列化读写文件可以通过以下步骤实现: 1. 首先,你需要创建一个数据类,该数据类将被序列化到文件中。例如,假设我们有一个名为 `Person` 的数据类,包含姓名和年龄属性: ```kotlin import java.io.Serializable data class Person(val name: String, val age: Int) : Serializable ``` 2. 接下来,你需要将对象序列化并写入文件。可以使用 `ObjectOutputStream` 来完成这个任务。下面是一个示例代码: ```kotlin import java.io.FileOutputStream import java.io.ObjectOutputStream fun writeObjectToFile(obj: Any, filePath: String) { val fileOutputStream = FileOutputStream(filePath) val objectOutputStream = ObjectOutputStream(fileOutputStream) objectOutputStream.writeObject(obj) objectOutputStream.close() fileOutputStream.close() } ``` 在上述代码中,`writeObjectToFile` 函数接受一个对象和文件路径作为参数,并将对象序列化后写入文件。 3. 最后,你可以使用 `ObjectInputStream` 从文件中读取已序列化的对象。以下是读取文件并反序列化对象的示例代码: ```kotlin import java.io.FileInputStream import java.io.ObjectInputStream fun readObjectFromFile(filePath: String): Any { val fileInputStream = FileInputStream(filePath) val objectInputStream = ObjectInputStream(fileInputStream) val obj = objectInputStream.readObject() objectInputStream.close() fileInputStream.close() return obj } ``` 在上述代码中,`readObjectFromFile` 函数接受文件路径作为参数,并返回从文件中读取并反序列化的对象。 使用上述代码,你可以将 `Person` 对象序列化并写入文件,然后从文件中读取并反序列化对象。以下是一个示例: ```kotlin fun main() { val person = Person("Alice", 25) val filePath = "person.ser" // 将对象序列化并写入文件 writeObjectToFile(person, filePath) // 从文件中读取并反序列化对象 val deserializedPerson = readObjectFromFile(filePath) as Person println(deserializedPerson) } ``` 上述示例中,我们先将 `Person` 对象序列化并写入文件,然后从文件中读取并反序列化对象,并最终打印出反序列化后的对象。 请注意,上述代码只是一个简单示例,你可以根据实际需求进行修改和扩展。此外,还需要注意的是,序列化的类需要实现 `java.io.Serializable` 接口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值