在我现在正在开发的应用程序中,部分功能是将设备上保存的数据写入通过 USB-OTG 适配器连接的闪存驱动器。具体来说,该设备是运行 4.2.2 的已 root 的 Motorola Xoom。我可以成功地将文件写入驱动器并在计算机上读取它们。那部分工作正常。但是,当我尝试用新信息替换现有文件时,生成的文件为空。我什至在写入新数据之前删除现有文件。奇怪的是,将内部文件的内容复制到闪存驱动器后,我记录了生成的文件的长度。它始终与输入文件匹配并且始终为非 0 数字,但该文件在我的计算机上仍然显示为空白。任何人都可以帮助解决这个问题吗?下面是我执行此工作的 AsyncTask
的相关代码。
@Override
protected Void doInBackground(Void... params) {
File[] files = context.getFilesDir().listFiles();
for (File file : files) {
if (file.isFile()) {
List<String> 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;
}
编辑:
根据 @Simon 的建议,我将 output.flush()
添加到我的代码中。这不会改变结果。
编辑#2: 我对此做了一些进一步的测试,发现了一些有趣的东西。如果我在写入闪存驱动器后但在将其从 OTG 适配器中移除之前转到“设置”->“存储”->“卸载 USB 存储”,则一切正常。但是,写入后未能弹出驱动器会导致数据无法写入。奇怪的是,文件夹结构和文件本身是在驱动器上创建的,但文件始终是空的。另一件事:如果我在删除驱动器之前转到文件管理器应用程序并打开文件,则文件都会按其应有的方式存在。然而,即使移除设备,将其直接插回平板电脑并打开任何文件也会导致文件看起来为空。我对此一无所知,这真是令人沮丧。谁能帮忙解决这个问题吗?
编辑#3: 我还更改为使用 FileReader 和 FileWriter 只是为了看看会发生什么。我现在并不关心效率,我只是希望文件写入能够可靠地工作。此更改不会影响该问题。更新的代码已发布在上面。
最佳答案
在 FileReader.read() 调用之前尝试使用 FileReader.ready()
方法,
并确保您的 FileReader
中是否确实有一些字节。
关于java - 尝试覆盖文件会导致空白文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845622/