1

私はこのコードを使用してオブジェクトをファイルに保存しました:

try{  
      FileOutputStream saveFile=new FileOutputStream("SaveObj.sav");


      ObjectOutputStream save = new ObjectOutputStream(saveFile);

      save.writeObject(x);

      save.close();
    }
    catch(Exception exc){
      exc.printStackTrace();
    }
  }
}

単一のオブジェクトを削除するにはどうすればよいですか?ファイルをどのくらいクリアしますか?

4

3 に答える 3

2

ええと、ファイルを空にするのはとても簡単です-書き込みのためにファイルを開いて、もう一度閉じてください:

new FileOutputStream("SaveObj.sav").close();

それはそれを空にします。ただし、多数のオブジェクトから1つのオブジェクトを消去しようとした場合、それははるかに複雑です。すべてのオブジェクトを読み込んで、保持したいオブジェクトだけを書き出すか、各オブジェクトが開始するファイルオフセットのインデックスを(おそらく別のファイルに)保持する必要があります。代わりにオブジェクトデータベースの使用を検討したいポイント。

于 2012-04-07T14:39:41.337 に答える
2

アーネストは、オブジェクトストリームからの特定のオブジェクトの削除が少し複雑であるという点で正しいです。彼はまた、ファイルを空にしたいときは、書き込み用に開いて閉じるだけでよいということも正しいです。ただし、ファイルシステムから削除する場合は、Fileオブジェクトを使用して削除することをお勧めします(例外と戻り値を正しく処理することを忘れないでください)。次の例は完全ではないかもしれませんが、純粋なJavaで目標を達成する方法についてのヒントを提供するはずです。お役に立てれば...


package test;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


public class Main {

  public static void main(String[] args) throws Exception {
    String filename = "object.serialized";
    {
      List objects = new ArrayList();
      objects.add("String1");
      objects.add("String2");
      objects.add("String3");
      writeObjectsToFile(filename, objects);
    }

    {
      List objects = readObjectsFromFile(filename);
      objects.remove(1);
      writeObjectsToFile(filename, objects);
    }

    {
      List objects = readObjectsFromFile(filename);
      for (Object object : objects) {
        System.out.println(object);
      }
    }

    emptyFile(filename);
    deleteFile(filename);
  }

  private static void emptyFile(String filename) throws IOException {
    OutputStream os = null;
    try {
      os = new FileOutputStream(filename);
    } finally {
      if (os != null) {
        os.close();
      }
    }
  }

  private static void deleteFile(String filename) {
    File f = new File(filename);
    if (f.delete()) {
      System.out.println(filename + " deleted sucessfully...");
    } else {
      System.out.println(filename + " deletion failed!");
    }
  }

  private static void writeObjectsToFile(String filename, List objects) throws IOException {
    OutputStream os = null;
    try {
      os = new FileOutputStream(filename);
      ObjectOutputStream oos = new ObjectOutputStream(os);
      for (Object object : objects) {
        oos.writeObject(object);
      }
      oos.flush();
    } finally {
      if (os != null) {
        os.close();
      }
    }
  }

  private static List readObjectsFromFile(String filename) throws IOException, ClassNotFoundException {
    List objects = new ArrayList();
    InputStream is = null;
    try {
      is = new FileInputStream(filename);
      ObjectInputStream ois = new ObjectInputStream(is);
      while (true) {
        try {
          Object object = ois.readObject();
          objects.add(object);
        } catch (EOFException ex) {
          break;
        }
      }
    } finally {
      if (is != null) {
        is.close();
      }
    }
    return objects;
  }

}

出力:


String1
String3
object.serialized deleted sucessfully...

于 2012-04-07T15:04:47.157 に答える
0

このテーマから長い時間が経過したことは知っていますが、将来の人々を助けるために、私にとってうまくいくのは、オブジェクトをnull値として再度書き込むことでした。

public static void writeIncidentsObjectsInCache(Object object) throws IOException {
    writeObject(INCIDENTS_CACHE, object); }

public static Object readIncidentsObjectFromCache() throws IOException,
        ClassNotFoundException {
    return readObject(INCIDENTS_CACHE); }

public static void clearIncidents() throws IOException, ClassNotFoundException {
    writeIncidentsObjectsInCache(null); }

public static void writeObject(String key, Object object) throws IOException {
    FileOutputStream fos = TheAAApp.getApp().openFileOutput(key, Context.MODE_PRIVATE);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(object);
    oos.close();
    fos.close();
}

public static Object readObject(String key) throws IOException,
        ClassNotFoundException {
    FileInputStream fis = TheAAApp.getApp().openFileInput(key);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Object object = ois.readObject();
    return object;
}
于 2016-05-19T15:59:52.500 に答える