将文件中的字符串附加到数组中并进行解析

时间:2014-06-15 10:17:06

标签: java serialization deserialization objectoutputstream

我正在尝试为我的GUI保存/加载设置。

到目前为止,我已经使用“属性”进行了保存:

Properties prop = new Properties();                   
prop.setProperty("a", Boolean.valueOf(boxRandomMouse.isSelected()).toString());  
prop.setProperty("b", listModelPath.toString());

我遇到的问题是,我将listModelPath的{​​{1}}保存到JList

String

在我的文件public static DefaultListModel<String> listModelPath; 下。我找不到任何方法来加载并将此b解析为我想要的类型listModelPath

可以使用下面的约束器初始化类Position

Position

或数组:

Position newPos = new Position(int x, int y, int z);

public Position[] toTown = new Position[] { new Position(3094, 3491, 0), new Position(3088, 3487, 0), new Position(3080, 3475, 0)}; String的{​​{1}}在保存到文件中时的显示方式

listModelPath

我需要弄清楚一种方法来解析上面的String,进入我的位置,或者以某种方式找到一种方法将这个数组保存到文件中,我真的不知道该怎么做。

我尝试过以不同的方式做这件事,总是失败,所以这就是我在这里的原因。 希望你们知道如何处理我在这里的情况。

PS。我刚刚开始阅读有关序列化的内容,或许它是要走的路?它是否允许我将我在应用程序中动态创建的数组保存到文件中而不将其转换为字符串并从字符串返回?

2 个答案:

答案 0 :(得分:0)

您可以序列化发送它的listModelPath对象,然后将其作为对象存档,然后将其作为对象读取,然后将其转换回真实的Class

这可以通过将ObjectOutputSteam链接到基础流(例如FileOutputStream,然后将Obejet写入其中Position[])来完成

public void writePositions() throws IOException, ClassNotFoundException {
  File file = new File("positions.ser");
  FileOutputStream outFile = new FileOutputStream(file);
  ObjectOutputStream outStream = new ObjectOutputStream(outFile);
  public Position[] toTown = new Position[] {
      new Position(3094, 3491, 0), 
      new Position(3088, 3487, 0),
      new Position(3080, 3475, 0)};
  outStream.writeObject(toTown);
  outStream.close();
  outFile.close();
}

您可以从写入的文件中读取序列化的Position数组, positions.ser ,如下所示:

public void readPositions() throws IOException, ClassNotFoundException {
  File file = new File("positions.ser");
  FileInputStream inFile = new FileInputStream(file);
  ObjectInputStream inStream = new ObjectInputStream(inFile);
  Position[] toTown = (Position[]) inStream.readObject());
  for(int i = 0; i < toTown.length; i++) {
    System.out.println(toTown[i]);
  }
  inStream.close();
  inFile.close();
  file.delete();
}

您应该注意Position类应该是Serializable,否则JVM不允许您将此类型的任何对象来回发送到内存文件中,甚至通过任何内容流。

我不确定我是否已经很好地理解了listModelPath的主要问题以及它与Position数组的关系,但你应该提供更多信息,特别是你如何创建listModelPath实例。

编辑(保存许多不同类型的对象):

您不仅可以保存一个Object,还可以保存尽可能多的ClassCastException。将对象加载回JVM时,应按照写入的顺序读取它们以避免public void writePositions() throws IOException, ClassNotFoundException { ... public Position[] toTown = new Position[] { new Position(3094, 3491, 0), new Position(3088, 3487, 0), new Position(3080, 3475, 0)}; outStream.writeObject(toTown); //Write the array of Position boolean selected = boxRandomMouse.isSelected(); outStream.writeObject(selected); //Write the Boolean Object ... } public void readPositions() throws IOException, ClassNotFoundException { ... Position[] toTown = (Position[]) inStream.readObject()); //Read the array of Position which was written first for(int i = 0; i < toTown.length; i++) { System.out.println(toTown[i]); } boolean selected = (boolean) inStream.readObject(); //Read the Boolean value which was written in the second order // And so on ... }

{{1}}

答案 1 :(得分:0)

您只能在属性文件中使用字符串,因此您必须找到以可逆方式转换listModelPath的方法。我认为您可以尝试json(GsonJackson),其作用是将对象序列化 - 反序列化为来自String。

如果没有Position课程的来源,我就不能再做了。