Kotlin(9)ファイルは、I / O、正規表現を学習し、マルチスレッド

1.ファイルI / O操作

1.1ファイルを読みます

  1. READTEXT:ファイルstringの内容全体を取得する
    あなたは、単にREADTEXTを(使用し、ファイルの内容を読みたい場合は、ファイルの内容全体を返すことができます)
fun getFileContent(filename: String): String{
   val f = File(filename)
   return f.readText(Charset.forName("UTF-8"))
}
  1. readLines:ファイルを取得行あたりのコンテンツを
    使用すると、各行の内容を取得したい場合、私たちはそれぞれの行のコンテンツの配列を取得するためにスプリット(「\ n」を)使用することができます。
    我々はまた、直接行の内容を取得するために、)(Kotlinパッケージ化readLinesを呼び出すことができます。
fun getFileLines(filename: String): List<String> {
    return File(filename).readLines(Charset.forName("UTF-8"))
}
  1. 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()
  1. BufferedReaderの:メソッドのシグネチャファイルを取得
fun File.bufferedReader(
   charset: Charset = Charsets.UTF_8
   bufferSize: Int = DEFAULT_BUFFER_SIZE
): BufferedReader

1.2書き込みファイル
Kotlinを使用して機能を拡張し、ファイルが非常に簡単になり書きます。私たちはあなたにも、バイトストリームを書き込むことができ、あなたが直接書き込み論文は通常分割、JavaのライターやOutputStreamのクラスを呼び出すことができ、文字列を書くことができ覆盖写、そして追加写2種類。

  1. WRITETEXT:書き込みファイルカバー
    、我々が使用しwriteText()たファイルに直接テキストの文字列への書き込みを
fun writeFile(text: String, destFile: String) {
    val f = File(destFile)
    if(!f.exists()){
       f.createNewFile()
    }
    //覆盖写入文件内容
    f.writeText(text, Charset.defaultCharset())
}
  1. appendfileは:APPEND書き込みファイル
    使用してappendFile()ファイルの内容を書き込むに追加するテキストを
//追加文件内容
fun appendFile(text: String, destFile: String){
    val f = File(destFile)
    if(!f.exists()){
       f.createNewFile()
    }
    f.appendText(text, Charset.defaultCharset())
}
  1. appendBytes:バイト配列を追加し
    、テキストファイルの内容が追加されたバイト配列の書き込みの最後に追加されます
fun File.appendBytes(array: ByteArray)
  1. BufferedWriterの:書き込みバッファオブジェクトを取得します
    変更されたファイルbufferedWrite()メソッドのシグネチャを取得
fun File.bufferedWriter(
  charset: Charset = charsets.UTF-8
  bufferSize: Int = DEFAULT_BUFFER_SIZE
): BufferedWriter

1.3ファイルツリートラバーサル

  1. 徒歩:ファイルツリートラバーサル
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)
}
  1. copyRecursively:再帰的なコピーファイルが
    コピーするか、変更ファイルを再帰的に指定したパス内のファイルが存在しない場合は、自動的に作成され、指定したパスにディレクトリとそのすべてのサブフォルダをコピーします。
fun File.copyRecursiverly(
    target: File,                   //目标文件
    overwrite: Boolean = false,     //是否覆盖。true:覆盖之前先删除原来的文件
    onError: (File, IOException) -> OnErrorAction = { _, exception -> throw exception }    //错误处理
)

2.ネットワークI / O

URL取得したHTML応答関数へのURL:

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.

Groovyの言語では、我々は、I / O操作を実行するためのシェルコマンドを使用することができます
まず、我々は文字列を拡張するexecute()ので、この関数は、シェルコマンド達成され、

//给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
}

上記2つの単純な機能の拡張が完了した後、次のコードにシェルコマンドを試験することができます。

val p = "ls".execute()

val exitCode = p.waitFor()
val text = p.text()

println(exitCode)
println(text)

4.正規表現

我々はまだパターンでJavaを使用するほかに、マッチャーと外の他のタイプは、Kotlinはまた、正規表現\ Regex.kt、聞かせてのは、正規表現のコンストラクタによって正規表現を作成\正規表現のクラスkotlin \テキストを提供しKotlin 。

4.1正規表現の発現構築
、次のように正規表現のコンストラクタを使用して:

//创建一个Regex对象,匹配的正则表达式是 [a-z]+
val r1 = Regex("[a-z]+") 

//RegexOption 是直接使用的Java类Pattern中的正则匹配选项
val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)

RegexOption Javaクラスパターンは規則的マッチに直接使用される
toRegexの文字列を(使用して)次のように

//直接使用Kotlin中给String扩展的toRegex函数
val r3 = "[A-Z]+".toRegex()

4.2正規表現関数

  1. マッチ()
    入力文字列のすべてがそうでない場合は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
  1. containsMatchIn()
    一致を返し偽がない場合、入力文字列の一致の少なくとも一つは、trueを返す場合
val r1 = Regex("[0-9]+")
>>>r1.containsMatchIn("012AAAE")
>true

>>>r1.containsMatchIn("asdad")
>false
  1. 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
  1. 置き換え(入力:のCharSequence、交換:文字列):文字列が
    入力文字列の一致の内容に置換コンテンツを置き換えます
val r1 = Regex("[0-9]+")
>>>r1.replace("12345XYZ","abcd")
//12345将被替换成abcd
>abcdXYZ
  1. (:たCharSequence、変換:(MatchResultの) - >たCharSequence INPUT):置き換える文字列
    交換()関数は、入力文字列の値と一致する関数であるtransform()マッピングの後に新しい値を置換します
val r1 = Regex("[0-9]+")
>>>r1.replace("1zxc2",{ (it.value.toInt() * it.value.toInt()).toString() })
//匹配到的数字开平方
>1zxc4
  1. ()関数を見つける
    戻る MatcherMatchResultマッチングオブジェクト。
val r1 = Regex("[0-9]+")
>>>r1.find("12314rsfiafp123asookf1`1")?.value()
>12314
  1. 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にAPIのJava正規表現を使用することができます

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スレッドの作成
中に、我々は、Javaの道を使用してスレッドを作成することができますので、我々は、KotlinでJavaクラスを使用することができますので。

  1. スレッドオブジェクトの作成式では
//用对象表达式创建一个线程
//object表达式
object : Thread() {
            override fun run() {
                sleep(1000)
                println("Hello")
            }
 }.start()
  1. 使用ラムダ式が
    ここでどのようにRunnable新しく作成されたスレッドインスタンスへの転送:
Thread {
       Thread.sleep(1000)
       println("hi")
}.start()
  1. 使用Kotlinは、Thread()関数をカプセル化
//kotlin中的线程操作
thread(start = true, isDaemon = false, name = "HiThread", priority = 4) {
       sleep(1000)
       println("hi")
}

5.2方法とシンクブロック
Kotlin同期をキーワード、それは置き換えられない@Synchronized注釈。次のように声明Kotlin同期方法は次のとおりです。

 @Synchronized
 fun appendFile(text: String, filename: String) {
        val f = File(filename)
        if (!f.exists()) {
            f.createNewFile()
        }
        f.appendText(text, Charset.defaultCharset())
 }

注釈だから@SynchronizedとJavaとsynchronized同じ効果
シンクブロックに関して、我々は、引数としてロックを使用して同期する機能を、使用します。

fun appendFileSync(text: String, filename: String) {
        val f = File(filename)
        if (!f.exists()) {
            f.createNewFile()
        }

        synchronized(this) {
            f.appendText(text, Charset.defaultCharset())
        }
    }

5.3変数フィールド
同様に、Kotlinなしvolatileキーワードが、@Volatileノート

    @Volatile
    var running = false

    fun start() {
        running = true
        thread(start = true) {
            while (running) {
                println("Start")
            }
        }
    }
    
    fun stop(){
        running = false;
        println("Stop")
    }
公開された248元の記事 ウォン称賛99 ビュー10万+

おすすめ

転載: blog.csdn.net/rikkatheworld/article/details/103005296