最近在用kotlin写一个copy assets文件到sd卡的操作时,发现kotlin下文件写入的神奇之处,特此记录一下
首先感谢大神
https://blog.csdn.net/u011976726/article/details/79125950
https://www.cnblogs.com/shaohz2014/p/3637918.html
作为开发我们都知道在java中Stream代表的是一种数据流或数据源,那对于数据流来说肯定包含输入流和输出流
java中的输入流我们叫InputStream, 输出流当然就是OutputStream, 对于数据流来说我们肯定要读取,那么java对封装单位通用方法就是read() 方法了。
java中读取数据流:
#### java 代码
void readStream(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[1024];
int nread;
while ((nread = input.read(buffer)) != -1) {
if (nread == 0) {
nread = input.read();
if (nread < 0)
break;
output.write(nread);
continue;
}
output.write(buffer, 0, nread);
}
}
kotlin代码
/*
* Usually
*/
@Throws(IOException::class)
fun wirteStreamFun2(`in`: InputStream, output: OutputStream){
var uread: Int = `in`.read()
`in`.use { `input` ->
output.use {
while (uread != -1){
it.write(uread)
uread = input.read()
}
}
}
}
/*
* Better
*/
@Throws(IOException::class)
fun writeStreamFun1(`in`: InputStream, output: OutputStream){
var uread: Int = -1
`in`.use { `input` ->
output.use {
val result = {uread = input.read(); uread}
//栗子 val aMethod = { print(""); 1} val aMethod = { Int_A = Int_B; Int_C} as Int_C
while(result() != -1){
it.write(uread)
}
}
}
}
/*
* Unbelievable
*/
@Throws(IOException::class)
fun witteStreamFun3(`in`: InputStream, output: OutputStream){
var uread: Int = -1
`in`.use{ `input` ->
output.use {
while(input.read().also { uread = it } != -1){
it.write(uread)
}
}
}
}
kotlin 给我们提供了更为简洁的写法,如下
/*
* Kotlin IO
*/
fun wirteStreamKt(`in`: InputStream, output: OutputStream, bufferSize: Int){
`in`.copyTo(output, bufferSize)
}
copyTo源码如下
/**
* Copies this stream to the given output stream, returning the number of bytes copied
*
* **Note** It is the caller's responsibility to close both of these resources.
*/
public fun InputStream.copyTo(out: OutputStream, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long {
var bytesCopied: Long = 0
val buffer = ByteArray(bufferSize)
var bytes = read(buffer)
while (bytes >= 0) {
out.write(buffer, 0, bytes)
bytesCopied += bytes
bytes = read(buffer)
}
return bytesCopied
}
我们可以清楚的看到kotlin 对于字节流的读写给我们做了二次封装。
对于kotlin更多关于数据流的操作,可以了解 org.jetbrains.kotlin.kotlin-stadlib:1..3.40 新特性或者可以看大神的文章
网友评论