파일 입출력 - swkim0128/PARA GitHub Wiki

1. 코틀린에서 파일 입출력 개요

코틀린에서는 java.io.File 클래스를 활용하여 파일을 읽고, 쓰고, 수정할 수 있다. 또한, 코틀린 표준 라이브러리를 사용하면 더 간결하게 파일 입출력을 처리할 수 있다.

2. 파일 쓰기 (Write)

1) writeText() - 텍스트 파일 쓰기

import java.io.File

fun main() {
    val file = File("example.txt")
    file.writeText("Hello, Kotlin!") // 파일에 텍스트 저장
}
  • 파일이 없으면 자동으로 생성됨.
  • 파일의 기존 내용을 덮어쓴다.

2) appendText() - 기존 파일에 내용 추가

import java.io.File

fun main() {
    val file = File("example.txt")
    file.appendText("\nWelcome to Kotlin File I/O!") // 기존 파일에 내용 추가
}
  • 기존 내용을 유지하면서 새로운 내용을 추가한다.
  • 파일이 없으면 새로 생성된다.

3) bufferedWriter() - 여러 줄 쓰기

import java.io.File

fun main() {
    val file = File("example.txt")
    file.bufferedWriter().use { writer ->
        writer.write("First Line")
        writer.newLine()
        writer.write("Second Line")
    }
}
  • use {} 블록을 사용하면 자동으로 close()가 호출됨.
  • newLine()을 사용하여 줄바꿈이 가능하다.

3. 파일 읽기 (Read)

1) readText() - 파일 전체 읽기

import java.io.File

fun main() {
    val file = File("example.txt")
    val content = file.readText()
    println(content)
}
  • 파일 내용을 문자열로 읽어올 수 있다.
  • 파일이 존재하지 않으면 FileNotFoundException이 발생할 수 있다.

2) readLines() - 한 줄씩 읽기

import java.io.File

fun main() {
    val file = File("example.txt")
    val lines = file.readLines()
    
    for (line in lines) {
        println(line)
    }
}
  • 파일의 각 줄을 리스트로 반환한다.
  • for 루프를 활용하여 줄 단위로 처리할 수 있다.

3) bufferedReader() - 효율적인 파일 읽기

import java.io.File

fun main() {
    val file = File("example.txt")
    file.bufferedReader().use { reader ->
        reader.forEachLine { line ->
            println(line)
        }
    }
}
  • bufferedReader()를 사용하면 대량의 데이터를 효율적으로 읽을 수 있다.
  • use {} 블록을 사용하여 자동으로 close() 호출.

4. 파일 존재 여부 확인

파일이 존재하는지 확인하려면 exists() 함수를 사용한다.

import java.io.File

fun main() {
    val file = File("example.txt")
    
    if (file.exists()) {
        println("파일이 존재합니다.")
    } else {
        println("파일이 존재하지 않습니다.")
    }
}
  • 파일이 존재하면 true, 없으면 false를 반환한다.

5. 파일 삭제

파일을 삭제하려면 delete() 함수를 사용한다.

import java.io.File

fun main() {
    val file = File("example.txt")

    if (file.exists()) {
        file.delete()
        println("파일 삭제 완료")
    } else {
        println("삭제할 파일이 없습니다.")
    }
}
  • 파일이 존재하면 삭제되고 true를 반환하며, 없으면 false를 반환한다.

6. 디렉토리 생성 및 삭제

1) mkdir() - 단일 디렉토리 생성

import java.io.File

fun main() {
    val dir = File("testDir")

    if (dir.mkdir()) {
        println("디렉토리 생성 완료")
    } else {
        println("디렉토리 생성 실패 또는 이미 존재함")
    }
}
  • 디렉토리가 없을 경우 생성한다.
  • 이미 존재하면 false를 반환한다.

2) mkdirs() - 여러 단계의 디렉토리 생성

import java.io.File

fun main() {
    val dir = File("parentDir/childDir")

    if (dir.mkdirs()) {
        println("디렉토리 생성 완료")
    } else {
        println("디렉토리 생성 실패 또는 이미 존재함")
    }
}
  • 여러 개의 디렉토리를 한 번에 생성할 수 있다.

3) deleteRecursively() - 디렉토리 삭제

import java.io.File

fun main() {
    val dir = File("testDir")

    if (dir.exists()) {
        dir.deleteRecursively()
        println("디렉토리 삭제 완료")
    }
}
  • 디렉토리 안의 모든 파일과 서브디렉토리까지 삭제한다.

7. 파일 복사 및 이동

1) 파일 복사

import java.io.File

fun main() {
    val source = File("example.txt")
    val destination = File("copy_example.txt")

    source.copyTo(destination, overwrite = true)
}
  • copyTo()를 사용하면 기존 파일을 유지하면서 복사할 수 있다.
  • overwrite = true를 설정하면 기존 파일을 덮어쓴다.

2) 파일 이동

import java.io.File

fun main() {
    val source = File("example.txt")
    val destination = File("moved_example.txt")

    source.renameTo(destination)
}
  • 파일 이름 변경 또는 새로운 위치로 이동 가능.
  • 단순히 renameTo()를 사용하면 원본 파일이 이동됨.

8. 예외 처리

파일 입출력은 예외가 발생할 가능성이 높으므로 예외 처리가 필요하다.

import java.io.File
import java.io.IOException

fun main() {
    try {
        val file = File("example.txt")
        val content = file.readText()
        println(content)
    } catch (e: IOException) {
        println("파일을 읽는 중 오류 발생: ${e.message}")
    }
}
  • 예외가 발생하더라도 프로그램이 멈추지 않고 안전하게 처리된다.

9. 파일 입출력 요약

기능 메서드 설명
파일 쓰기 writeText() 텍스트를 파일에 저장 (덮어쓰기)
appendText() 기존 파일에 내용 추가
bufferedWriter() 여러 줄을 효율적으로 쓰기
파일 읽기 readText() 파일 전체 읽기
readLines() 파일을 한 줄씩 리스트로 읽기
bufferedReader() 파일을 효율적으로 읽기
파일 존재 여부 exists() 파일이 존재하는지 확인
파일 삭제 delete() 파일 삭제
디렉토리 생성 mkdir(), mkdirs() 단일 또는 다중 디렉토리 생성
디렉토리 삭제 deleteRecursively() 하위 디렉토리 포함하여 삭제
파일 복사 copyTo() 파일 복사
파일 이동 renameTo() 파일 이동 또는 이름 변경

10. 결론

  • 파일을 읽고 쓰는 방법은 여러 가지가 있으며, 상황에 맞게 적절한 메서드를 사용해야 한다.
  • 디렉토리 조작, 파일 삭제, 파일 복사 및 이동 기능도 간편하게 지원된다.
  • 파일 입출력 작업은 예외 발생 가능성이 높으므로 반드시 예외 처리를 해야 한다.

코틀린의 표준 라이브러리를 활용하면 파일 입출력을 쉽게 처리할 수 있다.

⚠️ **GitHub.com Fallback** ⚠️