2013-03-25 2 views
2

Учитывая статический класс, например MyStaticClass, который имеет два метода для сохранения и сама загрузка в/из файла, как, например:Как сохранить статический класс в файл на Java?

private static void save() throws IOException { 
    FileOutputStream fos = new FileOutputStream(new File("myfile.dat")); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(???); 
    oos.close(); 
} 

private static void load() throws IOException { 
    FileInputStream fis = new FileInputStream(new File("myfile.dat")); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    ??? = (MyStaticClass) ois.readObject(); 
    ois.close(); 
} 

То, что я должен поставить на место ???, где я обычно поставил экземпляр объекта?

Может быть, есть способ сохранить статический класс в файле, отличный от того, который используется для экземпляров?

+2

Вы не сохраняете классы, вы сохраняете экземпляры. Поэтому make 'save()' принимает экземпляр класса в качестве аргумента и 'load()' возвращает загруженный экземпляр. –

+1

@SotiriosDelimanolis - Вы не сохраняете классы или экземпляры, вы сохраняете биты. Они могут представлять что угодно. –

+0

@HotLicks Я имею в виду «ObjectOutputStream» –

ответ

4

Насколько я знаю, вы не можете сделать это так. Но вы можете писать статические поля индивидуально, а не весь класс за один раз.

например.

public class MyClass() { 

    private static String staticField1; 
    private static String staticField2; 

    static { 
     load(); 
    } 

    private static void saveField(String fieldName, Object fieldValue) throws IOException { 
     FileOutputStream fos = new FileOutputStream(new File("MyClass-" + fieldName + ".dat")); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(fieldValue); 
     oos.close(); 
    } 


    private static Object readField(String fieldName) throws IOException { 
     FileInputStream fis = new FileInputStream(new File("MyClass-" + fieldName + ".dat")); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Object value = ois.readObject(); 
     ois.close(); 

     return value; 
    } 

    private static void save() throws IOException { 
     saveField("staticField1", staticField1); 
     saveField("staticField2", staticField2); 
    } 

    private static void load() throws IOException { 
     staticField1 = (String)readField("staticField1"); 
     staticField2 = (String)readField("staticField2"); 
    } 

} 
1

Я не уверен, что вы подразумеваете под «статическим классом». Если вы имеете в виду, что состояние класса состоит только из статических членов данных, затем сохраняйте эти члены данных в методе save() и обновите их в методе загрузки.

Если, с другой стороны, у вас есть нестатическое состояние, которое вы хотите сохранить, то похоже, что метод сохранения не должен быть статическим, а метод загрузки должен быть статическим и возвращать новый экземпляр.

Смежные вопросы