简体   繁体   中英

IllegalArgumentException while writing on sdcard

I saw this problem has been met many times, but strangely I was not able to find a solution.

I am trying to write a binary file to the SDcard. This is the source code:

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(); }
}

The Manifest contains

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

and I receive this error:

 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

From other posts I could understand that some functions are meant to write only in the private storage of the app, so they don't expect to manage directories and paths. Is some one able to help me? Whall I use a different method to write the data to the sd, or just make some other action before doing it? I'm trying to write to the sdcard a simple binary file (btw it's a precalculated sequence of number, and I need to pass it to my PC and then move it back to the assets, so, if there is a different way to obtain this goal, it's ok anyway).

Thank you very much.

You say that you are trying to write to external storage, but you are calling openFileOutput() , which is for internal storage.

Change:

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

to:

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

or, better yet, to:

new ObjectOutputStream(new FileOutputStream(new File(ctx.getExternalFilesDir(null), "longs.bin")));

I like CommonsWare's answer. I would simply like to add that if you ever DO want to go down a path, don't use / . Use File.separator . I don't think I've ever had any errors come up when simply using / but still.
So if you made a sub-folder called "To-dos" in the sdcard's directory, you would do something like the following:
new ObjectOutputStream(new File(Environment.getExternalStorageDirectory() + File.separator + "To-dos", "longs.bin"));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM