文件I/O操作
  • Kotlin的I/O操作是通过扩展函数来实现的。Kotlin的I/O操作的API是在kotlin.io包下。原则就是java已经有好用的就直接用,没有或者不好用的类,就在原有类的基础上进行功能扩展。
  • Kotlin文件读写常用的读写API如下:
//读取该文件的所有内容作为一个字符串返回
 public fun File.readText(charset: Charset = Charsets.UTF_8): String = readBytes().toString(charset)
//读取文件的每一行内容,存入一个List返回
public fun File.readLines(charset: Charset = Charsets.UTF_8): List<String>
//读取文件的所有内容以ByteArray的方式返回
public fun File.readBytes(): ByteArray = inputStream().use { input ->
//覆盖写入ByteArray字节数组流
public fun File.writeBytes(array: ByteArray): Unit = FileOutputStream(this).use { it.write(array) }
//覆盖写入text字符串到文件中
public fun File.writeText(text: String, charset: Charset = Charsets.UTF_8): Unit = writeBytes(text.toByteArray(charset))
//在文件末尾追加写入text字符串
public fun File.appendText(text: String, charset: Charset = Charsets.UTF_8): Unit = appendBytes(text.toByteArray(charset))
//在文件末尾追加写入ByteArray字节数组流
public fun File.appendBytes(array: ByteArray): Unit = FileOutputStream(this, true).use { it.write(array) }
读文件

有一个text.txt文件

android kotlin 加载asset 下文件_Desktop

  • readText获取全部文件内容字符串
    如果简单读取一个文件所有内容,可以使用readText()
@JvmStatic
    fun main(args: Array<String>) {
        val file = File("C:\\Users\\Administrator\\Desktop\\text.txt")
        val readText = file.readText(Charset.forName("gb2312"))
        println(readText)
    }

输出如下,如果不指定Charset 默认是UTF-8编码

Hello Word !
你好,明天 !
Hello,Android!
  • readLines:获取文件每行的内容List
val file = File("C:\\Users\\Administrator\\Desktop\\text.txt")
val readText = file.readLines(Charset.forName("gb2312"))
println(readText)
[Hello Word !, 你好,明天 !, Hello,Android!]
  • readBytes:读取字节流数组
val file = File("C:\\Users\\Administrator\\Desktop\\text.txt")
val readByte = file.readBytes()
println(readByte.joinToString(separator = ""))
// 调用java 
val reader = file.reader()
val inputStream = file.inputStream()
val bufferedReader = file.bufferedReader()
  • bufferedReader:获取文件的方法签名
public inline fun File.bufferedReader(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedReader =
    reader(charset).buffered(bufferSize)
@JvmStatic
    fun main(args: Array<String>) {//
        val file = File("C:\\Users\\Administrator\\Desktop\\text.txt")
        val bufferedReader = file.bufferedReader(Charset.forName("gb2312"))
        val lines = bufferedReader.lines()
        lines.forEach { println(it) }
//        val readLine = bufferedReader.readLine()
//        println(readLine)
    }
写文件

使用Kotlin扩展函数,写入文件也变得相当简单。与读取相似 可以写入字符串,也可以写入字节流。也可以调用java的Writer后者OutputStream类。分为一次性写入和追加写入两种情况。

  • WriteText():覆盖写文件
public fun File.writeText(text: String, charset: Charset = Charsets.UTF_8): Unit = writeBytes(text.toByteArray(charset))

文件不存在的话会自动创建文件

val file = File("C:\\Users\\Administrator\\Desktop\\write.txt")
file.writeText("我是写入的文字")
  • appendText()向一个文件的末尾追加写入内容Text
val file = File("C:\\Users\\Administrator\\Desktop\\write.txt")
file.appendText("-->我是追加内容")
println(file.readText())
  • appendBytes:追加写入字节数组
public fun File.appendBytes(array: ByteArray): Unit = FileOutputStream(this, true).use { it.write(array) }
  • bufferedWriter:获取缓存区写对象
public inline fun File.bufferedWriter(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedWriter =
    writer(charset).buffered(bufferSize)

可以先向缓存区写入File,然后用的时候再去读文件,如果找不到文件会抛出文件找不到异常

//写入
   File("kotlin.txt").bufferedWriter().use { out -> out.write("writer something") }
   //读取
   File("kotlin.txt").bufferedReader().use { println(it.readText()) }

输出

writer something
遍历文件树
  • walk函数:遍历文件树
@JvmStatic
    fun main(args: Array<String>) {
        val file = File("C:\\Users\\Administrator\\Desktop\\text\\")
        val walk = file.walk()
        walk.iterator().forEach {
            if (it.isFile) {
                println(it.absoluteFile)
                println(it.readText(Charset.forName("gb2312")))
            }
        }
    }

也可以通过filter筛选条件

val file = File("C:\\Users\\Administrator\\Desktop\\text\\")
val walk = file.walk()
val filter = walk.filter { it.name == "a.txt" }
filter.iterator().forEach { println(it.name) }
  • 递归复制文件
public fun File.copyRecursively(
    target: File,  //目标文件
    overwrite: Boolean = false, //是否覆盖,true 覆盖之前先删除原来的文件
    onError: (File, IOException) -> OnErrorAction = { _, exception -> throw exception }// 错误处理
): Boolean

调用如下,其中第三个lambda表达式可以不传,会走默认的实现。执行完成后,则会生成一个copyText文件夹里面有想要拷贝的文件。

@JvmStatic
    fun main(args: Array<String>) {
        val file = File("C:\\Users\\Administrator\\Desktop\\text\\")
        file.copyRecursively(File("C:\\Users\\Administrator\\Desktop\\copyText")
                , false)
    }
Kotlin网络IO的扩展
  • Kotlin为java SDK中的java.new.URL类增加了两个扩展方法,readBytes和readText。
  • 根据url获取相应的HTML
@JvmStatic
    fun main(args: Array<String>) {
        val r = URL("").readText()
        println(r)
    }

可以根据URL来获取一张图片比特流然后写入文件中

val r = URL("http://g.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2bbdd8ce9ebdde71191ef6d5f.jpg").readBytes()
        File("C:\\Users\\Administrator\\Desktop\\a.jpg").writeBytes(r)

执行之后会在桌面生成一张a 的图片