0

我看到这个问题已经遇到很多次了,但奇怪的是我找不到解决方案。

我正在尝试将二进制文件写入 SD 卡。这是源代码:

private void saveDataLongs() {
    try
    {
        ObjectOutputStream oos = new ObjectOutputStream(ctx.openFileOutput(Environment.getExternalStorageDirectory().getAbsolutePath()+"/longs.bin", ctx.MODE_WORLD_WRITEABLE));
        for (int w=0; w<longCount; w++)
            oos.writeLong(longs[w]);
        oos.close();
    }
    catch(IOException e)
    { e.printStackTrace(); }
}

清单包含

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我收到这个错误:

 01-21 22:19:57.323: E/AndroidRuntime(13713): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.ccc.ccc/it.ccc.ccc.Ccc}: java.lang.IllegalArgumentException: File /sdcard/longs.bin contains a path separator

从其他帖子中,我可以理解某些功能仅用于在应用程序的私有存储中写入,因此他们不希望管理目录和路径。有人能帮助我吗?我应该使用不同的方法将数据写入 sd,还是在执行之前进行一些其他操作?我正在尝试向 sdcard 写入一个简单的二进制文件(顺便说一句,它是一个预先计算的数字序列,我需要将它传递给我的 PC,然后将其移回资产,所以,如果有不同的方法来获取这个目标,反正没问题)。

非常感谢。

4

2 回答 2

2

您说您正在尝试写入外部存储,但您正在调用openFileOutput(),这是用于内部存储的。

改变:

new ObjectOutputStream(ctx.openFileOutput(Environment.getExternalStorageDirectory().getAbsolutePath()+"/longs.bin", ctx.MODE_WORLD_WRITEABLE));

至:

new ObjectOutputStream(new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "longs.bin")));

或者,更好的是:

new ObjectOutputStream(new FileOutputStream(new File(ctx.getExternalFilesDir(null), "longs.bin")));
于 2013-01-21T21:34:14.747 回答
0

我喜欢 CommonsWare 的回答。我只想补充一点,如果您确实想走一条路,请不要使用/. 使用File.separator. 我认为我在简单使用/但仍然没有出现任何错误时出现过。
因此,如果您在 sdcard 的目录中创建了一个名为“To-dos”的子文件夹,您将执行以下操作:
new ObjectOutputStream(new File(Environment.getExternalStorageDirectory() + File.separator + "To-dos", "longs.bin"));

于 2013-01-21T22:04:08.243 回答