리눅스 & 안드로이드2011. 4. 22. 11:33
Android에서 파일을 쓰는데는, 경우에 따라 문제가 발생할 수 있을 것 같다. 그 이유는 바로 buffered I/O 때문!

보통 파일에 어떤 내용을 쓸 경우, 대부분의 경우에는 신경쓸 일이 거의 없다.
하지만 Service/Client 사이에서 파일을 공유해야 하는 경우에는 문제가 될 것 같다.
(물론 Service/Client 사이에 데이터 공유를 위해 File을 사용하는게 옳은지 그른지에 대한 문제는 접어둔다;;)

어떤 Service에서 데이터를 File에 저장하고, 해당 파일의 경로를 Client에게 제공하는 경우,
Client는 아무 생각 없이 전달받은 파일경로에서 파일을 열고, 데이터를 읽어오려고 한다.

하지만, Android file I/O 구현에서는 기본적으로 buffered I/O를 사용하도록 강제(?)하고 있다.
(내가 찾지 못 한것일 수도 있지만, 현재까지는 파일 생성 옵션을 지정할 수 없게 되어 있다)

그래서, Service에서 수행한 파일쓰기 작업에 의해 파일에 실제 데이터가 씌어지기 전에, Client에서의 파일읽기 작업이 먼저 일어난다. VM에서의 어떤 효율을 위해 이렇게 강제(?)하고 있는지는 잘 모르겠지만, 개인적인 입장에서 답답하다. -_-;

관련된 내용을 검색하다가 Linux 에서의 File I/O와 관련된 좋은 글을 발견하였다.

Linux Direct IO의 이해 (Synchronous IO와의 차이를 기반으로) [출처: 알티스토리 http://altistory.net/333]

DB에서는 데이터 쓰기의 신뢰성이 중요하므로 이런 문제를 고민하는게 당연해 보이지만,
임베디드 시스템에서 역시 전원 등의 다양한 문제로 데이터 손실이 일어날 수 있으므로 중요한 문제이다.
(JAVA API design 때문인지, Android 구현의 문제인지는 잘 모르겠지만 수정 바람-_-; 누가? 수정 해 주려나?)

결론은 Binder에 대한 제대로 된 이해가 필요하다!-0-

아직 갈길이 멀다-_-; 파일로의 출력은 그때 그때 다른듯. 바로 출력이 되기도 하는 거 같다.

(1) 우선 FileOutputStream 등으로 출력 후, FileInputStream 등으로 바로 읽으려고 하면 출력이 바로 되는 것 같데, 심증만 있고 물증이 없다;;
(2) RandomAccessFile 이란 class가 있다. 이 class는 object constructor에서 "r" "rw" "rws" "rwd" 등으로 mode를 지정할 수 있도록 되어 있다.

위와 같이 아직은 알아보고 확인해 봐야 할 것들이 너무 많다-0-


Posted by 세월의돌