티스토리 뷰
레퍼런스 링크
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
링크
TAG
- 로드바이크
- MySQL
- chrome
- 알뜰폰
- jpa
- CentOS
- java
- bootstrap
- kotlin
- 자전거
- DynamoDB
- Spring MVC 3
- spring
- Kendo UI
- Eclipse
- 태그를 입력해 주세요.
- Docker
- jsp
- node.js
- 구동계
- 로드 바이크
- graylog
- Kendo UI Web Grid
- Spring Boot
- maven
- Tomcat
- 평속
- JHipster
- JavaScript
- jstl
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함