//파일 쓰기 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) }