java.io.File 의 listFiles() API 가 죽음.
안녕하세요.
좀 답답한 문제가 있어서 글로써 도움을 받기 위해 글을 씁니다.
현상:
directory 내의 파일을 리스팅하기 위해서 java.io.File 의 listFiles() API
directory 내의 한글이름 파일이 있으면 listFiles() API 가 어떤 exception 도 없이 그냥 죽어버림.
한글 파일명은
"일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사.txt"
file title이 한글 84자 입니다.
한글83자 파일은 정상적으로 리스팅 함. (한글83자 + .txt 확장자 = 253 bytes)
astro 앱으로도 한글84자 파일이 있는 directory를 읽으면 똑같이 죽어버림.
한글85자는 정상적으로 리스팅 됨. (정말 이상함.)
한글86자 부터는 listFiles() API 가 죽지는 않고 해당 파일만 리스팅에서 제외되고 나머지는 리스팅이 됨.
참고사항:
안드로이드의 파일시스템에서 filename max length는 255 bytes 입니다.
현재 시스템에서 file.encoding property는 UTF-8 입니다.
문의:
왜 java.io.File 의 listFiles() API 가 그냥 죽을 까요?
다른 개발자 분들의 예상되는 원인을 듣고 싶습니다. (이거 굉장히 답답하더군요. java API가 그냥 죽으니깐요.)
제 생각:
한글83자 파일은 (한글83자 + .txt 확장자 = 253 bytes) 이기 때문에 정상적으로 리스팅이 됨.
한글84자 파일은 (한글84자 + .txt 확장자 = 256 bytes) 255 bytes를 넘기 때문에 원래대로라면 리스팅에서 제외되고 listFiles() API는 죽으면 안됨.
그러나 256 이라는 숫자가 의심스럽습니다.
인코딩 부분도 의심스러우나 잘 모르겠습니다.
글을 읽어 주셔서 감사합니다.
답변 부탁드립니다. ^^
답변 감사합니다.
여러모로 해보았는데, 잘 모르겠네요.
1. (한글84자 + .txt 확장자 = 256 bytes) 은 String class의 getBytes() 의 결과인 byte[]의 length로 해서 나온 값입니다.
한글이 3 byte로 계산되던데요.
2. android 2.3 에서는 파일시스템으로 ext4 가 사용된다고 합니다. 아래 링크에 max filename length 가 나와있습니다.
http://en.wikipedia.org/wiki/Ext4
256 bytes 였네요. 그러나 마지막 1 byte는 null 이 들어가기 때문에 실제로 255 bytes 라고 생각하면 될 것 같습니다.
그러고 보면, (한글84자 + .txt 확장자 = 256 bytes) 은 딱 max filename length 라서 마지막에 null을 채울수가 없어서 그런것인가요???




한글 84 + '.txt'가 256 byte 가 맞나요? 한글 84자이면 84*2 = 168byte 아닌가요?
파일명 한글이 들어가서 255byte가 넘어가서 문제가 생기는 경우이면 혹시...
파일이름 일부가 짤려나가면서 파일이름이 깨진 상태가 되기 때문에 없는파일을 읽는 경우가 돼서 그런 것 아닐까요?
영어로만 된 파일명이라면 문제가 안생길 듯 한데... 이 부분도 한번 테스트 해보시면 어떨까요? 그만약 영문으로만 된 파일의 경우에도 동일한 증상이면 안드로이드에는 파일명이 255byte 초과하는 파일은 사용되면 안된다는 이야기가 될 거구요. 그렇지 않으면 한글같은 2바이트 문자를 처리하는 부분에 문제가 있는 거 아닐까요?
영문명만, 영문+한글, 한글만, 영문+타2바이트문자... 이런 식으로 한번 테스트 해보시죠.
자바는 유니코드기반으로 알고 있는데, 왜 256바이트가 아니라 255바이트가 limit인지 생각 좀 해봐야 겠네요.