[Android/Java] 파일 출력(FileOutputStream)관련 삽질 기록

2019. 5. 23. 09:13Programming/Android

반응형

문제 해결에 도움이 됐던 글들은 아래와 같습니다.

 

Android에서 바이너리 데이터를 출력하는 경우 FileOutputStream을 사용하면 쉽게 파일을 출력할 수 있다.

byte[] data = "Hello".getBytes();
File file = new File(path) //path는 파일의 경로를 가리키는 문자열이다.
File root = android.os.Environment.getExternalStorageDirectory();
String path = root.getAbsolutePath() + "/hello.txt";
FileOutputStream fos = null;
try {
    fos = new FileOutputStream(file, true);

    fos.write(data);
    // fos.flush(); // flush()를 사용해서 버퍼에 있는 내용을 즉시 쓸 수 있다.
} catch(Exception e) {
    e.printStackTrace();
} finally {
    try {
        if(fos != null) {
            fos.close();
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}

 

위의 코드는 path에 위치한 파일에 바이너리 데이터 data의 내용을 추가하는 코드이다. 코드가 실행되고나면 path에 나와있는, hello.txt파일에 "Hello"라는 문자열이 추가된다. getExternalStorageDirectory()를 이용해서 파일 경로를 불러오는데, 이 내용은 getExternalStorageDirectory, Android Developers를 참조하도록 하자. External이 SD카드를 의미하는 게 아니라는 점에 주의가 필요하다. (getExternalStorageDirectory()를 꼭 사용할 필요는 없지만, 접근 권한이 없는 경로를 입력했을 때는 파일을 찾을 수 없기 때문에 에러가 발생한다.)

 

FileOutputStream의 두 번째 인자는 생략 가능하다. 두 번째 인자는 append여부를 가리키며, true일 경우에는 기존의 파일 뒤에 내용을 추가하며, false일 경우에는 덮어쓰게 된다. 자세한 내용은 FileOutputStream, Android Developers를 참조하자.

 

나의 경우에는 코드와 상관없는 곳에서 굉장히 해멨다. 바이너리 데이터를 특정 파일에 계속해서 추가하는 코드를 작성한 상태였는데, 파일이 처음 생성된 이후 아무리 새로고침해도 용량이 늘어나지 않았다. 몇 시간동안 FileOutputStreamflush함수를 호출하고, FilesetWritable을 호출하고, 온갖시도를 하다가 PC에 꽂힌 모바일폰을 다시 마운트하니 용량이 늘어난 파일을 볼 수 있었다.
휴대폰마다 다르겠지만, 아무래도 마운트 시점 이후에 처음 생성된 파일은 복사하고, 그 뒤에는 갱신하지 않는 듯 했다. = ㅅ=)

반응형