最新の Lineage OS nightly 9-Aug-2017 (Android 7.1.2) を搭載した Samsung Galaxy S5 の場合:
FileOutputStream を使用して、SDCard のアプリ キャッシュ ディレクトリのファイルに書き込み、それを閉じます。SDカードは採用されていません。
File file = new File(fileName);
FileOutputStream fout = new FileOutputStream(file, true); // yes, append if exists
fout.write(buf, 0, len); // wrote a few MBs here
fout.close();
後でディレクトリを一覧表示すると、File.length() は数 MB ではなく 0 (ゼロ) になっています。ただし、ファイル内のすべてのバイトを読み取ることはできます。しかし、サイズはまだゼロとして表示されます。
File dir = new File(dirName);
File file = dir.listFiles()[index];
long fileSize = file.length(); // fileSize is zero until I reboot
Total Commander などの他のアプリでもゼロ サイズが表示されますが、ゼロ以外のファイルにコピーすることもできます。
電話の再起動後、ファイルは正しいサイズを示します。
工場出荷時にインストールされているファイル ブラウザ「ファイル」には、常に正しいサイズが表示されます。
また、Android バージョン 6.0、7.0、7.1、8.0 のエミュレーターで試してみましたが、すべて機能し、サイズも適切でした。
また、これは内部メモリ (またはエミュレートされたストレージ) では発生しません。SDCard でのみ発生します。
読み取りまたは書き込み中にエラー、例外は見られませんでした。