《Kotlin入門實戰(zhàn)》CH9 | 文件IO饥侵,正則和多線程

文件IO,正則和多線程

得益于kotlin的擴展函數(shù)衣屏,kotlin對java中api進行了改進躏升,對于java中好用的api直接使用,對于不好用的api進行了擴展和改進狼忱。

1 文件IO操作

讀寫

fun main() {
    val f = File("test.txt")

    // 寫入文件
    f.writeText("hello kotlin") // 默認為utf-8,覆蓋寫
    f.appendBytes(ByteArray(1).apply { this[0] = '\n'.toByte() }) // 追加一個字節(jié)
    f.appendText("hello io")  // 追加字符串

    // 讀取文本中所有數(shù)據(jù)
    val s = f.readText() // 默認為utf-8
    val ss = f.readLines() // 返回 List<String> 類型
    val bs  = f.readBytes() // 返回 ByteArray 相當于Java中的 Byte[]

    // 分塊讀取數(shù)據(jù)
    val buffer = f.bufferedReader()
    while(true){
        val line = buffer.readLine()
        if(line == null) break
        else println(line)
    }
}

編碼格式默認選擇utf-8

分塊寫入數(shù)據(jù)

fun main() {
    val f = File("test2.txt")
    val writer  = f.bufferedWriter()
    writer.appendln("line 1")
    writer.newLine()
    writer.appendln("line 2")
    //writer.flush()
    writer.close()
}

這里最好使用flush或者close膨疏,否則數(shù)據(jù)可能停留在緩沖區(qū)

遍歷文件夾

fun main() {
    val f = File("E:\\課件\\")
    val walk = f.walk()
    
    walk.forEach { println(it.absoluteFile) } // 遞歸打印所有文件
    
    println("-------------分隔符---------------")
    
    val filter =walk.filter { it -> it.name.contains("網(wǎng)絡(luò)安全") }
    filter.iterator().forEach { println(it.absoluteFile) }
}
E:\課件\網(wǎng)絡(luò)安全
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全
E:\課件\網(wǎng)絡(luò)安全.zip
-------------分隔符---------------
E:\課件
E:\課件\批判閱讀
E:\課件\批判閱讀\Unit One.doc
E:\課件\網(wǎng)絡(luò)安全
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全\crypto-10.ppt
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全\crypto-11.ppt
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全\crypto-13.ppt
E:\課件\網(wǎng)絡(luò)安全\網(wǎng)絡(luò)安全\crypto-14.ppt
...

遞歸復(fù)制文件

fun main() {
    val f = File("./")  // 當前項目文件夾
    val target = File("../tmep/")   //  復(fù)制到上一級目錄
    f.copyRecursively(target, true) //  遞歸復(fù)制
}

2 網(wǎng)絡(luò)IO

fun main() {
    val html = URL("https://www.baidu.com").readText()
    println(html) 
}

3 執(zhí)行shell指令

只需要對String類進行擴展即可

fun String.execute(): Process {
    return Runtime.getRuntime().exec(this)
}

fun Process.text(): String {
    val isr = InputStreamReader(this.inputStream)
    val reader = BufferedReader(isr)
    var line: String? = "";
    var out = ""
    while (line != null) {
        line = reader.readLine()
        out += line + "\n"
    }
    return out
}

這樣就可以這樣調(diào)用指令了

val p = "ls -al".execute()
val text = p.text()

4 正則表達式

matches

  • 全部匹配為true,否則為false

    val b1 = Regex("[a-z]+").matches("abcABC")  //false
    val b2 = Regex("[a-z]+", RegexOption.IGNORE_CASE).matches("abcABC") // true
    
    

containsMatchIn

  • 字符中至少一處匹配返回true

    val b3 = Regex("[0-9]+").containsMatchIn("012abc")  // true
    

matchEntire

  • 如果全部匹配則規(guī)則則返回對象

    val s4 = Regex("[0-9]+").matchEntire("1234abc")?.value 
    

replace

replaceAll

find

findAll

fun main() {
    val r1 = Regex("[a-z]+") //創(chuàng)建一個Regex 對象钻弄,匹配的正則表達式是[a-z]+
    val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)

    val b1 = Regex("[a-z]+").matches("abcABC")  //false
    val b2 = Regex("[a-z]+", RegexOption.IGNORE_CASE).matches("abcABC") // true
    val b3 = Regex("[0-9]+").containsMatchIn("012abc")  // true

    val s4 = Regex("[0-9]+").matchEntire("1234abc")?.value
    println(s4)     // null

    val s5 = Regex("[0-9]+").replace("12abc", "xxxx")
    val s6 = Regex("[0-9]").replace("1ABC2Z") { (it.value.toInt() *                             it.value.toInt()).toString() }
    
    val s7 = Regex("[0-9]+").find("12BAC3D")
    
    Regex("[0-9]+").findAll("12BAC3D").forEach { println(it.value) }  // 12 3

    // 使用Java正則表達式API
    val re = Regex("[0-9]+")
    val p = re.toPattern()
    val m = p.matcher("888ABC999")
    while (m.find()) {
        val d = m.group()
        println(d)
    }// 888 999
}

5 多線程編程

Kotlin中沒有synchronized佃却、volatile關(guān)鍵字。Kotlin的Any類似于Java的Object窘俺,但是沒有wait()饲帅、notify()和notifyAll()方法。

創(chuàng)建線程

擴展Thread類或者進行實例化并通過構(gòu)造函數(shù)傳遞一個Runnable瘤泪。因為我們可以很容易地在Kotlin中使用Java類灶泵,所以這兩個方式都可以使用。

fun main() {
    //object 對象表達式,匿名類繼承
    object : Thread() {
        override fun run() {
            Thread.sleep(3000)
            println("A 使用Thread 對象表達式: ${Thread.currentThread()}")
        }
    }.start()

    // Lambda 表達式对途,實際上 lambda 代替 runnable接口作為參數(shù)傳入
    Thread {
        Thread.sleep(2000)
        println("B 使用Lambda 表達式: ${Thread.currentThread()}")
    }.start()

    // 使用kotlin封裝的thread函數(shù)
    thread(start = true, isDaemon = false, name = "DThread", priority = 3) {
        Thread.sleep(1000)
        println("D 使用Kotlin 封裝的函數(shù)thread(): ${Thread.currentThread()}")
    }

}

同步方法和塊

synchronized不是Kotlin中的關(guān)鍵字赦邻,它替換為@Synchronized注解。

fun main() {
    @Synchronized fun f() {

    }
    // 同步代碼塊
    fun f2(){
        synchronized(Any()){

        }
    }
}

和Java的代碼基本上一樣

可變字段

Kotlin中沒有volatile關(guān)鍵字掀宋,取而代之的是@volatile注解深纲,效果和volatile一致

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劲妙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒喊,老刑警劉巖镣奋,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怀愧,居然都是意外死亡侨颈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門芯义,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈垢,“玉大人,你說我怎么就攤上這事扛拨≡欧郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長求泰。 經(jīng)常有香客問我央渣,道長,這世上最難降的妖魔是什么渴频? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任芽丹,我火速辦了婚禮,結(jié)果婚禮上卜朗,老公的妹妹穿的比我還像新娘拔第。我一直安慰自己,他們只是感情好场钉,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布蚊俺。 她就那樣靜靜地躺著,像睡著了一般惹悄。 火紅的嫁衣襯著肌膚如雪春叫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天泣港,我揣著相機與錄音暂殖,去河邊找鬼。 笑死当纱,一個胖子當著我的面吹牛呛每,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坡氯,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晨横,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箫柳?” 一聲冷哼從身側(cè)響起手形,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悯恍,沒想到半個月后库糠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡涮毫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年瞬欧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢防。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡艘虎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咒吐,到底是詐尸還是另有隱情野建,我是刑警寧澤属划,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贬墩,受9級特大地震影響榴嗅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陶舞,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一嗽测、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肿孵,春花似錦唠粥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛉腌,卻和暖如春官份,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烙丛。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工舅巷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人河咽。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓钠右,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忘蟹。 傳聞我的和親對象是個殘疾皇子飒房,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容