2012-05-10 3 views
0

내 응용 프로그램은 갤럭시 탭에 삼성 어댑터를 사용하여 외부 sdcard에 씁니다. USB 장치가 "안전하게 제거"되면 파일이 모두 정상이지만 장치를 안전하지 않게 제거하면 새로 작성된 파일은 모두 0 바이트입니다.0 안드로이드 갤럭시 탭에서 제대로 마운트 해제되지 않은 경우 외부 usb 장치의 파일을 바이브합니다. 10.1

String json = "{some data to export}"; 

    String folderPath = Environment.getExternalStorageDirectory().toString() + File.separator + "Storages" + File.separator + "usb" + File.separator + "sda"; 
    File outputFile = new File(folderPath, "export.txt"); 

    FileWriter writer = new FileWriter(outputFile); 
    BufferedWriter out = new BufferedWriter(writer); 
    out.write(json); 
    out.flush(); 
    out.close(); 

당신은 내가 플러싱하고 파일을 종료하고 볼 수 있듯이 안드로이드 실제로 전에 내용을 플러시 귀찮게하지처럼, 그러나 그것은 나에게 보이는 : 여기

코드의 삭감 버전입니다 usb가 마운트 해제됩니다.

확실한 해결책은 사용자에게 안전하게 마운트 해제하도록 알리는 것입니다. 그러나 사용자 모두는 어떤 사용자인지 알고 있습니다. 그렇다면 안드로이드가 파일의 내용을 SD 카드에 프로그래밍 방식으로 플러시하도록하는 방법이 있습니까?

합니다 (BufferedWriter.flush/BufferedWriter.close 외에)이 장치는 삼성 갤럭시 탭 10.1 GT-P7510 당신은 그것을 닫기 전에 파일을 sync() 필요

+0

'out.flush()'는 쓸데 없기 때문에'out.close()'는'Writer'를 닫기 전에 버퍼를 플러시합니다. 그것은 아무 것도 아프지 않으며 단지 불필요한 것입니다. – Chilledrat

답변

2

안드로이드 3.1을 실행하는 것입니다.

FileOutputStream fos=new FileOutputStream(someLikelyFileObject); 
    BufferedOutputStream out=new BufferedOutputStream(fos); 

    try { 
    // write stuff to out 

    out.flush(); 
    } 
    finally { 
    fos.getFD().sync(); 
    out.close(); 
    } 

자세한 내용은 this Android Developer Blog post을 참조하십시오.

+0

감사합니다. 나는 다음과 같이 테스트했습니다 : java.io.RandomAccessFile r = 새 RandomAccessFile (outputFile, "rw"); r.writeChars (json); r.getFD(). sync(); SD 카드를 안전하지 않게 제거하더라도 완벽하게 작동합니다. –