1

Google で検索していますが、質問に対する真の答えが見つかりません。私の質問は彼と同じですが、彼は MODE_APPEND を望んでおり、私のファイルには MODE_PRIVATE が必要です。どうすればよいですか?

これは私のコードです:

public boolean saveCustomButtonInfo (Context context, Vector<DocumentButtonInfo> info) throws Exception{
    String path= context.getFilesDir() + "/" + "Load";
    File file = new File(path);

    if(! file.exists()){
        file.mkdir();
        //Toast.makeText(context,file.getAbsolutePath(),Toast.LENGTH_LONG).show();
     }
    path=path+"/DocumentActivityCustomButtonsInfo.obj";
    try{
        FileOutputStream out=context.openFileOutput(path,Context.MODE_PRIVATE);
        ObjectOutputStream outObject=new ObjectOutputStream(out);
        outObject.writeObject(info);
        outObject.flush();
        out.close();
        outObject.close();
        return true;
    }catch(Exception ex){
        throw ex;

    }
}
4

1 に答える 1

3

/でスラッシュ ( ) を含むパスを使用することはできませんopenFileOutput()getFilesDir()さらに重要なことは、 と の両方を結合しようとしていることopenFileOutput()です。これは不要であり、この問題を引き起こしています。

コードを次のように変更します。

public void saveCustomButtonInfo (Context context, List<DocumentButtonInfo> info) throws Exception {
    File dir = new File(context.getFilesDir(), "Load");

    if(! dir.exists()){
        dir.mkdir();
    }
    File f = new File(dir, "DocumentActivityCustomButtonsInfo.obj");
    FileOutputStream out=new FileOutputStream(f);
    ObjectOutputStream outObject=new ObjectOutputStream(out);
    outObject.writeObject(info);
    outObject.flush();
    out.getFD().sync();
    outObject.close();
}

注:

  • Vector約15年間廃止されています
  • ファイルシステムのパスを構築するために連結を使用しないでください。適切なFileコンストラクタを使用する
  • 再スローするためだけに例外をキャッチしても意味がありません
  • boolean常にある a を返すことに意味はありませんtrue
  • a を呼び出しgetFD().sync()て、FileOutputStreamすべてのバイトがディスクに書き込まれていることを確認します
于 2016-12-10T14:35:03.093 に答える