티스토리 뷰

SW 개발/Kotlin

Kotlin, File 저장 및 불러오기

지단로보트 2018. 12. 4. 02:28

레퍼런스 링크

build.gradle.kts

  • 프로젝트 루트의 build.gradle.kts 파일에 아래 내용을 추가한다.
dependencies {
    implementation("commons-io:commons-io:2.8.0")
}
  • Apache Commons IO은 여러 유용한 유틸리티 메써드를 제공하여 라이브러리 사용을 추천한다.

파일 쓰기

// 시스템의 임시 디렉토리명을 획득, 운영체제마다 다름
// Windows 10의 경우 C:\Users\\AppData\Local\Temp\
var pathname = System.getProperty("java.io.tmpdir")
var someFile = File(pathname + "some-file.txt")

// 문자열을 앞서 지정한 경로에 파일로 저장, 저장시 캐릭터셋은 기본값인 UTF-8으로 저장
// 이미 파일이 존재할 경우 덮어쓰기로 저장 // 파일이 아닌 디렉토리이거나 기타의 이유로 저장이 불가능할 경우 FileNotFoundException 발생
try {
    someFile.writeText("가나다라마바사")
} catch (e: FileNotFoundException) {
    logger.info("FileNotFound: $pathname$filename")
}

// 저장시 캐릭터셋으로 EUC-KR을 명시하여 저장
someFile.writeText("가나다라마바사", Charset.forName("EUC-KR"))

URL로부터 파일 복사

  • FileUtils.copyURLToFile()을 이용하여 원격지 URL로부터 로컬 파일로 다운로드할 수 있다.
// 원격지 URL로부터 파일 복사
FileUtils.copyURLToFile(
    soruce = URL("{source-url}"),
    destination = File("{destination-file-path}"),
    connectionTimeout = 5000,
    readTimeout = 10000
)

InputStream으로부터 파일 복사

  • FileUtils.copyInputStreamToFile()을 이용하여 InputStream 객체로부터 로컬 파일로 다운로드할 수 있다.
// InputStream으로부터 파일 복사
someInputStream.use {
    FileUtils.copyInputStreamToFile(source = it, desitaion = someFile)
}

Amazon S3로부터 파일 복사

  • Amazon S3 오브젝트를 로컬 파일로 복사하는 예는 아래와 같다.
val someFile = File("{someFilePath}")
// 파일이 존재하지 않을 경우에만 복사
if (!someFile.exists() || someFile.length() == 0L) {
    someFile.parentFile.mkdirs()
    val s3Object = amazonS3Client.getObject(bucket, key)
    // InputStream은 use{} 람다 블록 사용하여 자동 자원 해제
    s3Object.objectContent.use {
        FileUtils.copyInputStreamToFile(it, someFile)
    }
}

Google Drive로부터 파일 복사

  • Google Drive API를 이용하여 구글 드라이브에 업로드된 파일을 로컬 파일로 복사하는 예는 아래와 같다.
val someFile = File("{someFilePath}")
// 파일이 존재하지 않을 경우에만 복사
if (!someFile.exists() || someFile.length() == 0L) {
    someFile.parentFile.mkdirs()
    // OutputStream은 use{} 람다 블록 사용하여 자동 자원 해제
    someFile.outputStream().use {
        drive.files()[fileId].executeMediaAndDownloadTo(it)
    }
}

파일 읽기

var pathname = System.getProperty("java.io.tmpdir")
var filename = "some-file.txt"
var someFile = File(pathname + filename)

// 파일을 문자열로 읽음, 캐릭터셋은 기본값은 UTF-8로 로드
// 파일이 존재하지 않을 경우 FileNotFoundException 발생
// 파일을 한 번에 모두 읽기 때문에 2GB 크기 제한을 가짐
try {     
    someFile.readText(Charset.forName("UTF-8")) 
} catch (e: FileNotFoundException) {
    logger.info("FileNotFound: $pathname$filename") 
}  // 캐릭터셋으로 EUC-KR을 명시하여 읽음
someFile.readText(Charset.forName("EUC-KR")) 

트러블슈팅: 파일 생성시 한글 파일명 깨짐 문제

  • 애플리케이션에서 빌드된 컨테이너 런타임에서 파일 저장시 파일명에 한글을 포함한 CJK 계열 문자열이 포함될 경우 ???와 같이 문자열이 깨지는 이슈를 있어 유의해야 한다.
  • 원인은 도커 컨테이너 이미지의 기본 로케일이 POSIX로 설정되어 있기 때문인데 이를 C.UTF-8로 수정하면 해결된다. 수정 방법은 도커 컨테이너 실행시 전달되는 환경 변수에 아래 항목을 추가하면 된다. [관련 링크 1] [관련 링크 2]
LC_ALL=C.UTF-8

참고글 링크

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함