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に書き込むのでしょうか、それとも実行する前に他のアクションを実行するのでしょうか。SDカードに単純なバイナリファイルを書き込もうとしています(これは事前に計算された数値のシーケンスであり、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ます。単に使っただけでエラーが発生したことはないと思います/が、それでも。
したがって、SDカードのディレクトリに「To-dos」というサブフォルダを作成した場合は、次のようになります。
new ObjectOutputStream(new File(Environment.getExternalStorageDirectory() + File.separator + "To-dos", "longs.bin"));

于 2013-01-21T22:04:08.243 に答える