반응형

자바 / 코틀린에서는 File이라는 클래스를 이용하여 파일 및 디렉터리를 다룰 수 있습니다.
따라서 File 객체는 파일일 수도 디렉터리일 수도 있습니다.

 


자주 쓰는 File 클래스의 생성자

File(String parent, String Child) - parent 폴더 경로의 child라는 파일에 대한 File 객체를 생성

  • ex) File(path, fileName)

File(String pathname) - pathname에 해당되는 파일의 File 객체를 생성

  • ex) File(path)

예시로 진행할 프로젝트의 디렉터리 구성


현재 디렉터리 확인하기

System.getProperty(”user.dir”)

을 사용하여 현재 디렉터리를 확인할 수 있습니다.

맥 / Intelli J 기준 현재 디렉터리

프로젝트명이 boostCamp라서 boostCamp까지 표기된 모습을 확인할 수 있습니다.

 

출력 결과 

/Users/hyunsoo/IdeaProjects/boostCamp

디렉터리 생성하기

예시 코드

import java.io.File

fun main() {

    val path = System.getProperty("user.dir") + "/src/main/kotlin"

    println("생성할 디렉터리명을 입력해주세요!")
    val dirName = readln()

    val dir = File(path, "$dirName") // else File("$path/$dirName")
    // 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성 
    if (!dir.exists()) dir.mkdir()
    else println("이미 해당 디렉터리가 존재합니다.")

}

이 코드는 디렉터리명을 입력받고 현재 디렉터리 + /src/main/kotlin 경로에 입력받은 문자열을 디렉터리의 이름으로 생성합니다.

val path = System.getProperty("user.dir") + "/src/main/kotlin"

먼저 path 변수에 경로를 지정해주고 

println("생성할 디렉터리명을 입력해주세요!")
val dirName = readln()

 

생성할 디렉터리의 이름을 지정해줍니다.

val dir = File(path, "$dirName") // 이렿게도 가능 File("$path/$dirName")

디렉터리 경로 + 생성할 디렉터리 이름으로 File 객체를 생성해줍니다. 
File클래스의 첫 번째 인자는 경로, 두 번째 인자는 생성할 디렉터리의 이름입니다.

// 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성
if (!dir.exists()) dir.mkdir()
else println("이미 해당 디렉터리가 존재합니다.")

File 클래스의 exists 함수를 사용하여 해당 경로에 생성할 디렉터리와 이름이 동일한 디렉터리가 존재하는지 확인합니다.
만약 존재하지 않는다면 mkdir()를 사용하여 해당 경로에 디렉터리를 생성하고 만약 존재한다면 디렉터리를 생성하지 않고 콘솔창에 경고문을 출력합니다.


동작 모습

첫 번째 soo라는 디렉터리를 처음 생성할 때에는 디렉터리가 잘 생성되는 것을 볼 수 있습니다!

그 후 이미 해당 디렉터리가 존재하는 상황에서는 콘솔창에 경고문이 출력됩니다.


파일 생성하기

예시 코드

import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter

fun main() {

    // 현재 디렉터리의 정보를 가져온 후 프로젝트의 구조에 맞게 경로를 설정
    val path = System.getProperty("user.dir") + "/src/main/kotlin"

    println("생성할 디렉터리명을 입력해주세요!")
    val dirName = readln()

    val dir = File(path, "$dirName") // else File("$path/$dirName")
    // 해당 경로에 디렉터리가 존재하지 않는다면 디렉터리 생성
    if (!dir.exists()) dir.mkdir()
    else println("이미 해당 디렉터리가 존재합니다.")

    val content = """
            fun main(){
            println("테스트")
            }
        """.trimIndent()

    println("파일명을 입력해주세요!")
    val fileName = readln()
    val file = File("$path/$dirName", "$fileName.kt")

    val fileWriter = FileWriter(file)
    fileWriter.write(content)
    fileWriter.close()

//    val bw = BufferedWriter(fileWriter)
//    bw.write(content)
//    bw.close()

}

 

이 코드는 디렉터리명과 파일명을 입력받아서 해당 디렉터리를 생성한 후 그 디렉터리 안에 해당 파일을 생성하는 코드입니다.
디렉터리 생성 부분은 위와 동일합니다.

val content = """
    fun main(){
    println("테스트")
    }
""".trimIndent()

생성할 텍스트 파일의 내용으로 들어갈 문자열입니다.

println("파일명을 입력해주세요!")
val fileName = readln()
val file = File("$path/$dirName", "$fileName.kt")

첫 번째 인자로는 해당 파일을 생성할 경로를 두 번재 인자로는 생성할 파일의 이름을 지정한 File 객체를 생성합니다.

val fileWriter = FileWriter(file)
fileWriter.write(content)
fileWriter.close()

//    val bw = BufferedWriter(fileWriter)
//    bw.write(content)
//    bw.close()

간단한 텍스트 기반의 파일을 생성할 것이므로 방금 생성한 File 객체를 FileWriter에게 넘겨 Filewriter 객체를 생성해준 후 content의 내용으로 해당 파일을 write합니다.

BufferedWriter 객체를 생성 후 fileWriter을 넘겨주고 BufferedWriter에서 파일을 쓰면 속도가 조금 더 향상됩니다!
만약 동일한 디렉터리에 동일한 파일명을 가진 파일이 이미 존재한다면 내용을 덮어쓰게 됩니다!

동작 모습


파일 읽기

예시 코드

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.File
import java.io.FileReader
import java.io.FileWriter

fun main() {

    // 현재 디렉터리의 정보를 가져온 후 프로젝트의 구조에 맞게 경로를 설정
    val path = System.getProperty("user.dir") + "/src/main/kotlin"
    
    val fileName = "peach.kt"

    val file = File("$path/soo", "$fileName")
    val fileReader = FileReader(file)

    fileReader.readLines().forEach {
        println(it)
    }

//    val br = BufferedReader(fileReader)
//    while (true){
//        val line = br.readLine() ?: break
//        println(line)
//    }

}

이 코드는 위에서 생성한 soo 디렉터리 내의 peach.kt 파일을 읽기위한 코드 입니다..! 

val file = File("$path/soo", "$fileName")
val fileReader = FileReader(file)

디렉터리, 파일 이름에 해당하는 File 객체를 생성해주고 해당 객체를 FileReader에게 넘겨줍니다.

fileReader.readLines().forEach {
    println(it)
}

//    val br = BufferedReader(fileReader)
//    while (true){
//        val line = br.readLine() ?: break
//        println(line)
//    }

생성한 fileReader 객체의 readLines() 메서드를 이용하여 읽어들인 파일을 List<String> 형태로 반환받습니다.
(줄 바꿈을 기준으로 하나의 String을 생성)
해당 리스트를 forEach를 사용하여 순차적으로 출력하도록 하였습니다.

주석 처리된부분은 BufferedReader을 사용하여 파일을 읽어오는 모습입니다. fileReader보다 조금 더 속도가 빠르며, reaLine()으로 한 줄씩 읽는 모습을 확인할 수 있습니다. while(true)를 사용하여 반복적으로 한 줄씩 읽어온 후 해당 파일을 다 읽어오게 되었다면 break를 통해 반복문을 탈출하게 됩니다.

동작모습


추가로 읽으면 좋을 것

BufferedReader & BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바

 

BufferedReader & BufferedWriter - 빠른 입출력(Kotlin - 코틀린). feat, 자바

BufferedReader / BufferedWriter bufferedReader, bufferedWriter는 이름에서 확인할 수 있듯이 버퍼를 이용하여 읽고 쓰는 역할을 하는 메서드입니다. 버퍼란? 버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하.

soopeach.tistory.com

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기