Json, Text, mp3,pdf 같은 파일들을 우리는 assets
폴더와 res/raw
폴더에 저장하곤 합니다.
하지만 둘다 파일 접근이 가능하죠.
// From assets
assets.open(assetPathFilename)
// From res/raw
resources.openRawResource(resourceRawFilename)
그렇다면 과연 어디에 저장하는것이 좀더 좋을까요?
assets 폴더는 공백과 대문자를 원하는대로 지정할 수 있습니다.
하지만 raw폴더는 소문자, az, 0-9, 밑줄만 포함될 수 있습니다.
assets -> GO NHN FORWARD.pdf
raw -> go_nhn_forward.pdf
assets 폴더는 하위폴더를 분류하면 확인할 수 있습니다.
반면에 raw 폴더는 root에 존재해야만 합니다.
assets폴더는 list()
를 통해 파일 이름을 가져올수 있습니다.
assets.list(FOLDER_NAME)?.forEach {
println(it)
}
하지만 raw폴더는 파일이름을 나열할 수 없습니다.
assets은 문자열을 필요로 하기때문에, 없을경우 catch
문이 필요합니다.
runcatching{
assets.open("filename")
}
하지만 raw일경우, identifier명을 필요로 하기 때문에 반드시 파일이 있어야 합니다.
resources.openRawResource(R.raw.filename)
버전별로 파일이 분기처리 될수도 있습니다.
예를들어 API 29인경우, 다른 PDF나 mp3를 사용해야할수도 있습니다.
assets은 수동으로 이것을 해결해야합니다.
반면에 raw일 경우, 폴더를 분리함으로써 기종별 리소스를 변경할 수 있습니다.
XML에서 assets에 있는 파일을 접근하기가 쉽지 않습니다.
반면에 raw는 @raw/filename
을 통해 쉽게 접근이 가능합니다.
서로 장단점이 있으니 아래의 표를 보고 상황에 맞춰 선택하면 될것 같습니다.
localTest
를 할때, 우리는 local json 파일를 이용해, 파싱 테스트를 진행하곤 합니다.
근데 json 파일을 어디에 두어야 하는걸까요?
일단 Context 접근이 불가능하기에, res폴더에 두는것은 불가능합니다.
안드로이드는 이럴때를 대비해 resource
폴더를 제공하고 있습니다.
resource 폴더는 컴파일될때 java 클래스 경로의 루트에 배치되게 됩니다.
그렇다고 main에서 resource 폴더를 사용할 경우, 헷갈리기 때문에
test 폴더에서만 resource를 사용하도록 합시다.
<3