1. æ件I/Oæä½
1.1 读æ件
-
readTextï¼è·åæä»¶å ¨é¨å 容å符串
å¦ææ³è¦ç®åç读åæ件å 容ï¼åä½¿ç¨ readText()ï¼å¯ä»¥è¿åæ´ä¸ªæ件å 容
fun getFileContent(filename: String): String{
val f = File(filename)
return f.readText(Charset.forName("UTF-8"))
}
-
readLines:è·åæ件æ¯è¡å 容
å¦ææ³è¦è·åæ¯è¡çå 容ï¼æ们å¯ä»¥ä½¿ç¨ split("\n")æ¥è·å¾ä¸ä¸ªæ¯è¡å 容çæ°ç»ã
æ们ä¹å¯ä»¥ç´æ¥è°ç¨Kotlinå°è£ 好çreadLines()ï¼è·åæ¯è¡çå 容ï¼
fun getFileLines(filename: String): List<String> {
return File(filename).readLines(Charset.forName("UTF-8"))
}
- readBytes()ï¼è¯»ååèæµæ°ç»
//è¿åè¿ä¸ªæ件çåèæ°ç»
val bytes: ByteArray = f.readBytes()
println(bytes.joinToString(separator = " "))
//ä¸Javaäºæä½ï¼ç´æ¥è°ç¨Javaä¸çInputStream
val reader: Read = f.reader()
val inputStream: InputStream = f.inputStream()
val bufferedReader: BufferedReader = f.bufferedReader()
- bufferedReader:è·åæ件çæ¹æ³ç¾å
fun File.bufferedReader(
charset: Charset = Charsets.UTF_8
bufferSize: Int = DEFAULT_BUFFER_SIZE
):
1.2 åæ件
使ç¨Kotlinæ©å±çå½æ°ï¼åå ¥æ件ä¹åå¾ç¸å½ç®åãæ们å¯ä»¥åå ¥å符串ï¼ä¹å¯ä»¥åå ¥åèæµï¼è¿å¯ä»¥ç´æ¥è°ç¨JavaçWriteræè OutputStreamç±»ï¼åæ件é常å为ââ
âè¦çåâ
ââåâ
â追å åâ
â两ç§ã
-
writeTextï¼è¦çåæ件
æ们使ç¨ââ
âç´æ¥åä¸ä¸ªæ件ä¸åå ¥å符串textçå 容âwriteText()â
fun writeFile(text: String, destFile: String) {
val f = File(destFile)
if(!f.exists()){
f.createNewFile()
}
//è¦çåå
¥æ件å
容
f.writeText(text, Charset.defaultCharset())
}
-
appendFile: æ«å°¾è¿½å åæ件
使ç¨ââ
â åä¸ä¸ªæ件çæ«å°¾è¿½å åå ¥å 容textâappendFile()â
//追å æ件å
容
fun appendFile(text: String, destFile: String){
val f = File(destFile)
if(!f.exists()){
f.createNewFile()
}
f.appendText(text, Charset.defaultCharset())
}
-
appendBytes: 追å åå ¥åèæ°ç»
追å åèæ°ç»å°è¯¥æ件çæ«å°¾è¿½å åå ¥å 容text
fun File.appendBytes(array: ByteArray)
-
bufferedWriter: è·åç¼ååºå对象
è·åæ¹æ件çbufferedWrite()æ¹æ³ç¾å
fun File.bufferedWriter(
charset: Charset = charsets.UTF-8
bufferSize: Int = DEFAULT_BUFFER_SIZE
):
1.3 éåæ件æ
- walk:éåæ件æ
fun traverseFileTree(filename: String) {
val f = File(filename)
val fileTreeWalk = f.walk()
//éåæ件夹ä¸é¢çæææ件çè·¯å¾
fileTreeWalk.iterator().forEach{ println(it.absolutePath) }
}
//éåå½åæ件ä¸ææçåç®å½æ件ï¼å¹¶å°ç»æåå
¥å°ä¸ä¸ª Iteratorä¸
fun getFileIterator(filename: String): Iterator<File> {
val f = File(filename)
val fileTreeWalk = f.walk()
return fileTreeWalk.iterator()
}
//æ们éåå½åæ件夹ä¸çææç®å½ï¼è¿å¯ä»¥æ ¹æ®æ¡ä»¶è¿è¡è¿æ»¤
fun getFileSequenceBy(filename: String, p: (File) -> Boolean): Sequuence<File> {
val f = File(filename)
//æ ¹æ®æ¡ä»¶pè¿æ»¤
return f.walk().fileter(p)
}
-
copyRecursively :éå½å¤å¶æ件
å¤å¶æ¹æ件æè éå½å¤å¶è¯¥ç®å½åå ¶ææåæ件å°æå®è·¯å¾ä¸ï¼ å¦ææå®è·¯å¾ä¸çæ件ä¸åå¨ï¼ä¼èªå¨å建ã
fun File.copyRecursiverly(
target: File, //ç®æ æ件
overwrite: Boolean = false, //æ¯å¦è¦çãtrueï¼è¦çä¹åå
å é¤åæ¥çæ件
onError: (File, IOException) -> OnErrorAction = { _, exception -> throw exception } //é误å¤ç
)
2. ç½ç»I/O
æ ¹æ®URLè·å该URLååºHTMLå½æ°ï¼
fun getUrlContent(url: String): String{
//è·å该URLçååºHTMLææ¬
return URL(url).readText(Charset.defaultCharset())
}
æ ¹æ®URLè·å该URLååºæ¯ç¹æ°ç»å½æ°ï¼
fun getUrlBytes(url: String): ByteArray{
return URL(url).readBytes()
}
æURLååºåèæ°ç»åå ¥æ件ä¸ï¼
fun writeUrlBytesTo(filename: String, url: String){
val bytes = URL(url).readBytes()
File(filename).writeBytes(bytes)
}
3. æ§è¡Shellå½ä»¤
å¨Groovyè¯è¨ä¸ï¼æ们å¯ä»¥ç¨Shellå½ä»¤æ¥æ§è¡I/Oæä½
é¦å æ们æ¥æ©å± Stringç ââ
âexecute()â
âï¼è®©è¿ä¸ªå½æ°æ¥å®ç°Shellå½ä»¤
//ç»Stringæ©å± execute()å½æ°
fun String.execute(): Process {
val runtime = Runtime.getRuntime()
return runtime.exec(this)
}
//ç¶åç»Processç±»æ©å±ä¸ä¸ª text() å½æ°
fun Process.text(): String {
var output = ""
val inputStream = this.inputStream
val isr = InputStreamReader(inputStream)
var reader = BufferedReader(isr)
var line: String? = ""
while (line != null) {
line = reader.readLine()
output += line + "\n"
}
return output
}
å®æäºä¸é¢ä¸¤ä¸ªç®åå½æ°çæ©å±åï¼å°±å¯ä»¥å¨ä¸é¢ç代ç ä¸æµè¯ Shellå½ä»¤ï¼
val p = "ls".execute()
val exitCode = p.waitFor()
val text = p.text()
println(exitCode)
println(text)
4. æ£å表达å¼
æ们å¨Kotlinä¸é¤äºä»ç¶å¯ä»¥ä½¿ç¨ Javaä¸ç PatternãMatcherçç±»ä¹å¤ï¼Kotlinè¿æä¾äºä¸ä¸ªæ£å表达å¼ç±» kotlin\text\regex\Regex.ktï¼æ们éè¿ Regexçæé å½æ°æ¥å建ä¸ä¸ªæ£å表达å¼ã
4.1 æé Regex表达å¼
使ç¨Regexæé å½æ°å¦ä¸ï¼
//å建ä¸ä¸ªRegex对象ï¼å¹é
çæ£å表达å¼æ¯ [a-z]+
val r1 = Regex("[a-z]+")
//RegexOption æ¯ç´æ¥ä½¿ç¨çJavaç±»Patternä¸çæ£åå¹é
é项
val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)
RegexOption æ¯ç´æ¥ä½¿ç¨çJavaç±»Patternä¸çæ£åå¹é é项
使ç¨Stringç toRegex() å¦ä¸ï¼
//ç´æ¥ä½¿ç¨Kotlinä¸ç»Stringæ©å±çtoRegexå½æ°
val r3 = "[A-Z]+".toRegex()
4.2 Regexå½æ°
-
matches()
å¦æè¾å ¥çåç¬¦ä¸²å ¨é¨å¹é æ£å表达å¼åè¿å trueï¼å¦åè¿åfalse
val r1 = Regex("[a-z]+")
>>>r1.matches("ABCzxc") //å
¶ä¸å¤§åçABCä¸å¹é
ï¼åè¿åfalse
>false
val r2 = Regex("[a-z]+",RegexOption.IGNORE_CASE) //æ£å表达å¼ï¼å¿½ç¥å¤§å°
>>>r2.matches("ABCzxc")
>true
valr r3 = [A-Z]+".toRegex()
>>>r3.matches("123123")
>false
-
containsMatchIn()
å¦æè¾å ¥å符串ä¸è³å°æä¸ä¸ªå¹é å°±è¿å trueï¼å¦æ没æå¹é å°±è¿åfalse
val r1 = Regex("[0-9]+")
>>>r1.containsMatchIn("012AAAE")
>true
>>>r1.containsMatchIn("asdad")
>false
-
matchEntire()
å¦æè¾å ¥çåç¬¦ä¸²å ¨é¨å¹é ï¼åè¿åä¸ä¸ªMacherMatchResultï¼å¦åè¿ånull
val r1 = Regex("[0-9]+")
>>>r1.matchEntire("1234567890") //å
¨é¨æ»¡è¶³æ¡ä»¶
>kotlin.text.MacherMatchResult@xxxxxx
>>>r1.matchEntire("1234567890!")
>null
//æ们å¯ä»¥è®¿é®MatcherMatchResultçvalueå±æ§æ¥è·å¾å¹é
çå¼
//å
¶ä¸ç使ç¨äºå®å
¨è°ç¨ç¬¦ï¼è¡¨æå¯ä»¥è¿å空å¼
>>>r1.matchEntire("1234567890")?.value
>1234567890
-
replace(input: CharSequence, replacement: String): String
æè¾å ¥çå符串ä¸å¹é çå 容æ¿æ¢æ replacementçå 容
val r1 = Regex("[0-9]+")
>>>r1.replace("12345XYZ","abcd")
//12345å°è¢«æ¿æ¢æabcd
>abcdXYZ
-
replace(input: CharSequence, transform:(MatchResult) -> CharSequence): String
replace()çåè½æ¯æè¾å ¥çå符串ä¸å¹é å°çå¼ï¼ç¨å½æ°ââ
â æ å°ä¹åçæ°å¼è¿è¡æ¿æ¢âtransform()â
val r1 = Regex("[0-9]+")
>>>r1.replace("1zxc2",{ (it.value.toInt() * it.value.toInt()).toString() })
//å¹é
å°çæ°åå¼å¹³æ¹
>1zxc4
-
find()å½æ°
ä¼è¿å第ä¸ä¸ªå¹é çMatcherMatchResult对象ã
val r1 = Regex("[0-9]+")
>>>r1.find("12314rsfiafp123asookf1`1")?.value()
>12314
-
findAll()
è¿åææå¹é çMatcherMatchResultåºåã
val r1 = Regex("[0-9]+")
val sequence = r1.findAll("123abc456def789gh")
>>>sequence
>kotlin.sequences.GeneratorSequence@xxxxx
>>>sequence.forEach{println(it.value)}
>123
>456
>789
4.3 使ç¨Javaçæ£å表达å¼
å¨Kotlinä¸ä»ç¶å¯ä»¥ä½¿ç¨Javaæ£å表达å¼çAPI
val r1 = Regex("[0-9]+")
val p = r1.toPattern()
val m = p.matcher("123abc456")
while (m.find()) {
val d = m.group()
println(d)
}
>123
>456
5. å¤çº¿ç¨ç¼ç¨
5.1 å建线ç¨
å 为æ们å¯ä»¥å¨Kotlinä¸ä½¿ç¨Javaçç±»ï¼æ以æ们å¯ä»¥ä½¿ç¨Javaçæ¹å¼å建ä¸ä¸ªçº¿ç¨ï¼
- ç¨å¯¹è±¡è¡¨è¾¾å¼å建ä¸ä¸ªçº¿ç¨
//ç¨å¯¹è±¡è¡¨è¾¾å¼å建ä¸ä¸ªçº¿ç¨
//object表达å¼
object : Thread() {
override fun run() {
sleep(1000)
println("Hello")
}
}.start()
-
使ç¨Lambda表达å¼
ä¸é¢æ¯å¦ä½å°ä¸ä¸ªââ
âä¼ éç»ä¸ä¸ªæ°å建çThreadå®ä¾ï¼âRunnableâ
Thread {
Thread.sleep(1000)
println("hi")
}.start()
- 使ç¨Kotlinå°è£ çThread()å½æ°
//kotlinä¸ç线ç¨æä½
thread(start = true, isDaemon = false, name = "HiThread", priority = 4) {
sleep(1000)
println("hi")
}
5.2 åæ¥æ¹æ³åå
synchronizedä¸æ¯Kotlinä¸çå ³é®åï¼å®æ¿æ¢ä¸º ââ
â@Synchronizedâ
â注解ãKotlinä¸çåæ¥æ¹æ³ç声æå¦ä¸ï¼
@Synchronized
fun appendFile(text: String, filename: String) {
val f = File(filename)
if (!f.exists()) {
f.createNewFile()
}
f.appendText(text, Charset.defaultCharset())
}
fun appendFileSync(text: String, filename: String) {
val f = File(filename)
if (!f.exists()) {
f.createNewFile()
}
synchronized(this) {
f.appendText(text, Charset.defaultCharset())
}
}
@Volatile
var running = false
fun start() {
running = true
thread(start = true) {
while (running) {
println("Start")
}
}
}
fun stop(){
running = false;
println("Stop")
}