Note that there are some explanatory texts on larger screens.

plurals
  1. POAttempting to overwrite files results in blank files
    text
    copied!<p>In the app I am working on right now, part of the functionality is to write data saved on the device to a flash drive connected via a USB-OTG adapter. Specifically, the device is a rooted Motorola Xoom running 4.2.2. I can successfully write files to the drive and read them on my computer. That part works fine. However, when I try to replace existing files with new information, the resulting files come out empty. I even delete the existing files before writing new data. What's weird is that after copying the contents of my internal file to the flash drive, I log the length of the resulting file. It always matches the input file and is always a non-0 number, yet the file still shows up as blank on my computer. Can anyone help with this problem? Relevant code from the <code>AsyncTask</code> that I have doing this work is below.</p> <pre><code>@Override protected Void doInBackground(Void... params) { File[] files = context.getFilesDir().listFiles(); for (File file : files) { if (file.isFile()) { List&lt;String&gt; nameSegments = Arrays.asList(file.getName().split( "_")); Log.d("source file", "size: " + file.length()); String destinationPath = "/storage/usbdisk0/" + nameSegments.get(0) + "/" + nameSegments.get(1) + "/"; File destinationPathFile = new File(destinationPath); if (!destinationPathFile.mkdirs()) { destinationPathFile.mkdirs(); } File destinationFile = new File(destinationPathFile, nameSegments.get(2)); FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(file); fw = new FileWriter(destinationFile, false); int c = fr.read(); while (c != -1) { fw.write(c); c = fr.read(); } fw.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { fr.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Log.d("destination file", "size: " + new File(destinationFile.getPath()).length()); } } return null; } </code></pre> <p>EDIT: Per @Simon's suggestion, I added <code>output.flush()</code> to my code. This does not change the result.</p> <p>EDIT #2: I did some further testing with this and found something interesting. If I go to Settings->Storage->Unmount USB Storage after writing to the flash drive but before removing it from the OTG adapter, everything works perfectly. However, failing to eject the drive after writing results in the data not being written. What's strange is that the folder structure and file itself are created on the drive, but the file is always empty. One more thing: if I go to a file manager application and open up the file prior to removing the drive, the files all exist as they should. However, even removing the device, plugging it straight back in to the tablet and opening any of the files results in the file looking empty. I can't make heads or tails of this, and this is incredibly frustrating. Can anyone help with this?</p> <p>EDIT #3: I also changed to using <code>FileReader</code>s and <code>FileWriter</code>s just to wee what would happen. I don't care about efficiency at this point, I simply want file writing to work reliably. This change did not affect the issue. Updated code is posted above.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload