java - 尝试覆盖文件会导致空白文件

标签 java android file

在我现在正在开发的应用程序中,部分功能是将设备上保存的数据写入通过 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/

相关文章:

java - 如何完全替换一个数字而不中间修改?

android - 我旋转的 TextView 被截断了。我必须做什么?

Java 6 文件输入输出流(同一个文件)

java - 使用 URL 参数的 JSF Managed Bean 方法调用

java - 我的按钮未显示在 Android Studio 中

javascript - 在特定元素上禁用移动长按上下文菜单

Python - 从文件中剥离最后一个字节的最简单方法?

file - 在同一文件上写入并行模拟

java - Solr 4.0 保留对已删除文件的引用

android - 在android中打开通知时页面不刷新