文件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文件
- 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("https://blog.csdn.net/").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 的图片