Added utility functions for simple file reading by lines and by byte blocks
This commit is contained in:
@@ -3,6 +3,8 @@ package kotlin.io
|
|||||||
import java.io.*
|
import java.io.*
|
||||||
import java.nio.charset.*
|
import java.nio.charset.*
|
||||||
import java.util.NoSuchElementException
|
import java.util.NoSuchElementException
|
||||||
|
import java.util.List
|
||||||
|
import java.util.ArrayList
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
|
|
||||||
@@ -147,3 +149,56 @@ public fun File.copyTo(file: File, bufferSize: Int = defaultBufferSize): Long {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads file by byte blocks and calls closure for each block read. Block size depends on implementation but never less than 512.
|
||||||
|
* This functions passes byte array and amount of bytes in this buffer to the closure function.
|
||||||
|
*
|
||||||
|
* You can use this function for huge files
|
||||||
|
*/
|
||||||
|
fun File.forEachBlock(closure : (ByteArray, Int) -> Unit) : Unit {
|
||||||
|
val arr = ByteArray(4096)
|
||||||
|
val fis = FileInputStream(this)
|
||||||
|
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
val size = fis.read(arr)
|
||||||
|
if (size == -1) {
|
||||||
|
break
|
||||||
|
} else if (size > 0) {
|
||||||
|
closure(arr, size)
|
||||||
|
}
|
||||||
|
} while(true)
|
||||||
|
} finally {
|
||||||
|
fis.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads file line by line. Default charset is UTF-8.
|
||||||
|
*
|
||||||
|
* You may use this function on huge files
|
||||||
|
*/
|
||||||
|
fun File.forEachLine (charset : String = "UTF-8", closure : (line : String) -> Unit) : Unit {
|
||||||
|
val reader = BufferedReader(InputStreamReader(FileInputStream(this), charset))
|
||||||
|
try {
|
||||||
|
reader.forEachLine(closure)
|
||||||
|
} finally {
|
||||||
|
reader.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads file content as strings list. By default uses UTF-8 charset.
|
||||||
|
*
|
||||||
|
* Do not use this function for huge files.
|
||||||
|
*/
|
||||||
|
fun File.readLines(charset : String = "UTF-8") : List<String> {
|
||||||
|
val rs = ArrayList<String>()
|
||||||
|
|
||||||
|
this.forEachLine(charset) { (line : String) : Unit ->
|
||||||
|
rs.add(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user