Kotlin File IO

Kotlin DEVELOPMENT IT
//파일 쓰기 1
import java.io.IOException
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardOpenOption

fun main(){
    val path = "/file/path/hello.txt"
    val text = "안녕안녕안녕안녕n헬로헬로헬로헬로"

    try {
        Files.write(Paths.get(path), text.toByteArray(), StandardOpenOption.CREATE)
    }catch(e: IOException){
				//Exception 처리
    }
}

//standardOpenOption의 옵션은 CREATE, APPEND, WRITE, READ가 있다.
//파일 쓰기 2
import java.io.File
import java.io.FileWriter
import java.io.PrintWriter

fun main(){
    val outString: String = "안녕하신가?tWhat are you doing now?nAre you Serious??rStrawberies!!"
    val path = "/Users/seungcheonseo/kproject/data/testfile.txt"

    val file = File(path)
    val printWriter = PrintWriter(file)

    printWriter.println(outString)
    printWriter.close()

		//이것도 같고
    File(path).printWriter().use{ out -> out.println(outString) }

		//이것도 같다. 인자가 하나이기에 이렇게까지 줄일 수 있다.
    File(path).printWriter().use{ it.println(outString) }
}

//코틀린 표준 함수인 use를 사용하면 람다식으로 전달 받은 개체가 사용된 뒤 자동으로 안전하게 파일을 닫아준다.
//파일 쓰기 3
val file = File(path)
file.writeText(outString)
file.appendText("nDo Great Work!")

val writer = FileWriter(path, true)
try{
    writer.write(outString)
}catch(e: Exception){
    //오류 발생!
}finally{
    writer.close()
}
//코틀린 책 493페이지 참조
//파일 읽기 1
import java.io.*

fun main(){
    val path = "/Users/seungcheonseo/kproject/data/otr.txt"

    try{
        val read = FileReader(path)
        println(read.readText())
    }catch(e: Exception){
        println(e.message)
    }
}
//JAVA식 파일읽기 KOTLIN으로 변경
import java.io.*
import java.lang.Exception

fun main(){
    val path = "/Users/seungcheonseo/kproject/data/otr.txt"

    //단순변환
    val file = File(path)
    val inputStream: InputStream = file.inputStream()
    val inputStreamReader = InputStreamReader(inputStream)
    val sb = StringBuilder()
    var line:  String?
    val br = BufferedReader(inputStreamReader)
    try{
        line = br.readLine()
        while(line != null){
            sb.append(line, 'n')
            line = br.readLine()
        }
        println(sb)
    }catch(e: Exception){

    }finally{
        br.close()
    }

}

//실행하는데 문제는 없지만 단순히 코드를 코틀린에 대응하도록 바꿨기에 보기에도 좋지 않고 코드도 여전히 길다.

//완전 코틀린식으로 변환!
val file = File(path)
val inputStream: InputStream = file.inputStream()
val text = inputStream.bufferedReader().use { it.readText() }
println(text)

//Java의 InputStream에는 bufferedReader가 없지만,
//코틀린의 kotlin.io 라이브러리 패키지에서 확장 함수 기법으로 InputStream에 추가되었다.

//file객체를 생략하고 이렇게도 수정 가능
val bufferedReader: BufferedReader = File(path).bufferedReader()
val inputString = bufferedReader.use { it.readText() }
println(inputString)

//줄 단위로 처리하려면 usd() 대신 useLines()를 사용 가능. 코틀린의 시퀀스를 이용하고 있으면 사용 후 파일을 자동으로 닫는다.
val bufferedReader = File(path).bufferedReader()
val lineList = mutableListOf<String>()
bufferedReader.useLines { lines -> lines.forEach { lineList.add(it) } }
lineList.forEach { println("> " + it) }

//이제 bufferedReader까지 생략하고 파일을 직접 사용해보자.
val lineList = mutableListOf<String>()
File(path).useLines { lines -> lines.forEach { lineList.add(it) } }
lineList.forEach { println("> " + it) }

//이렇게 코틀린의 표준 함수와 함께 파일 읽기와 쓰기를 구현하면 코드를 간략하게 작성할 수 있다.

//파일 복사
File(path).copyTo(File("/Users/seungcheonseo/kproject/data/otr2.txt"))

//파일의 내용 출력하기
File(path).forEachLine { println(it) }

//바이트 단위로 읽기 (쓰기는 writeBytes())
val bytes = File(path).readBytes()
println(Arrays.toString(bytes))

//줄 단위로 읽기
val lines = File(path).readLines()
lines.forEach { println(it) }

//텍스트 단위위로 읽기 (쓰기는 writeTest())
val text = File(path).readText()
text.forEach { println(it) }

댓글 남기기