+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.
I/O 관련 클래스
InputStream: Byte 단위로 입력을 읽어 온다.
- FileInputStream: 파일을 Byte 단위로 읽기 위한 클래스
OutputStream: Byte 단위로 출력한다.
- FileOutputStream: 파일을 Byte 단위로 쓰기 위한 클래스
Reader: 문자 단위로 입력을 읽어 온다.
- FileReader: 파일을 문자 단위로 읽기 위한 클래스
Writer: 문자 단위로 출력한다.
- FileWriter: 파일을 문자 단위로 쓰기 위한 클래스
< FileWriter 예제 코드 >
import java.io.FileWriter
fun main() {
val writer = FileWriter("data.txt") // 쓰기 위한 텍스트 파일 지정 (없으면 생성)
try {
writer.write("a") // data.txt 파일에 "a" 작성 (1 byte)
writer.write("가") // 바로 뒤에 "가" 작성 (3 byte)
} finally {
writer.close() // 문제가 발생하더라도 반드시 writer를 닫아주어야 한다.
}
}
< FileReader 예제 코드 >
import java.io.FileReader
import java.io.FileWriter
fun main() {
val reader = FileReader("data.txt") // // 읽기 위한 텍스트 파일 지정
try {
val first = reader.read().toChar() // 한 글자를 읽어올 때, Int로 반환되기 때문에 문자로 변환
val second = reader.read().toChar()
println("$first $second") // a 가
val third = reader.read()
println("$third") // -1 (더 이상 읽을 것이 없으므로 -> 파일에 두 글자가 있다는 것을 알 수 있다.)
} finally {
reader.close() // 문제가 발생하더라도 반드시 writer를 닫아주어야 한다.
}
}
< FileInputStream 예제 코드 >
import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter
fun main() {
val inputStream = FileInputStream("data.txt")
try {
var idx = 0
while (true) {
val b = inputStream.read()
if (b < 0) break // 더 이상 읽을 값이 없으면 -1을 반환하므로
println("$idx: $b")
idx += 1
}
} finally {
inputStream.close()
}
// a: 1 byte, 가: 3 byte 이므로 4번 반복한다.
}
use 함수
전통적인 I/O 연산이다.
- close()를 사용하지 않아도 자동으로 닫을 수 있다.
- {} 내에서 it을 사용할 수 있다.
< FileInputStream 예제에 적용 >
import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter
fun main() {
FileInputStream("data.txt").use{ // FileInputStream("data.txt") 객체가 it이 된다.
var idx = 0
while (true) {
val b = it.read()
if (b < 0) break // 더 이상 읽을 값이 없으면 -1을 반환하므로
println("$idx: $b")
idx += 1
}
}
}
< FileReader 예제에 적용 >
import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter
fun main() {
FileReader("data.txt").use{
var idx = 0
while (true) {
val b = it.read()
if (b < 0) break
println("$idx: ${b.toChar()}")
idx ++
}
}
}
스트림 전체 읽어오기
import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter
fun main() {
FileWriter("data.txt").use{
it.write("One\nTwo\nThree")
}
// 줄 단위로 읽기 위해 buffered 사용
FileReader("data.txt").buffered().use {
println(it.readLine()) // 한줄만 출력
}
FileReader("data.txt").use {
println(it.readText()) // 줄 별로 '\n'을 적용하여 한번에 출력
}
println(FileReader("data.txt").readLines()) // [One, Two, Three] (리스트에 담겨서 출력)
// 자동으로 close() 실행
println(FileReader("data.txt").readLines().forEachIndexed {idx, line -> println("$idx: $line")})
}
import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter
fun main() {
// data.txt의 전체를 줄별로 리스트에 담고 it이 그 리스트를 가리킨다.
FileReader("data.txt").useLines {
it.forEachIndexed { idx, line ->
println("$idx: $line")
}
}
// data.txt에서 줄별로 실행할 코드를 안에 작성한다. (it은 그 줄에 있는 String을 가리킨다.)
FileReader("data.txt").forEachLine {
println("$it")
}
}
'Study > Kotlin Study' 카테고리의 다른 글
[Kotlin] 제네릭스 (0) | 2023.11.28 |
---|---|
[Kotlin] 컬렉션 유틸리티 (1) | 2023.11.21 |
[Kotlin] 컬렉션 타입 (0) | 2023.11.20 |
[Kotlin] 봉인된 클래스 (1) | 2023.11.14 |
[Kotlin] 부호 없는 정수 (0) | 2023.11.14 |