【问题标题】:Appending String from a File into an Array and parsing it将文件中的字符串附加到数组中并解析它
【发布时间】:2014-08-05 09:19:15
【问题描述】:

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

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

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

我遇到的问题是,我将 listModelPath 中的 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)};

这是listModelPathString 保存到文件后的样子

c=[[x\=3094, y\=3491, z\=0], [x\=3092, y\=3491, z\=0], [x\=3090, y\=3491, z\=0], [x\=3088, y\=3490, z\=0], [x\=3086, y\=3488, z\=0], [x\=3084, y\=3486, z\=0], [x\=3082, y\=3484, z\=0], [x\=3081, y\=3482, z\=0], [x\=3080, y\=3481, z\=0], [x\=3080, y\=3479, z\=0], [x\=3080, y\=3477, z\=0], [x\=2045, y\=5194, z\=0], [x\=2044, y\=5192, z\=0], [x\=2042, y\=5190, z\=0], [x\=2041, y\=5189, z\=0]]

我需要想办法将上面的字符串解析到我的位置,或者以某种方式找到将这个数组保存到文件的方法,我真的不知道该怎么做。

我已经尝试过以不同的方式多次这样做,但总是失败,所以这就是我在这里的原因。 希望你们知道如何处理我在这里遇到的情况。

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

【问题讨论】:

    标签: java serialization deserialization objectoutputstream


    【解决方案1】:

    您可以序列化您的 listModelPath 对象,然后将其作为 Object 文件发送,然后您可以将其作为对象读取,然后将其转换回其真实的 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,还可以根据需要保存任意数量,无论它们是什么类型。将对象加载回 JVM 时,应按照写入时的顺序读取它们,以避免出现ClassCastException

    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
      ...
    }
    

    【讨论】:

    • 谢谢,这回答了一切。
    • @BlackDynamite 永远欢迎您...您甚至可以投票以使未来的访问者符合条件:)
    • 恐怕我做不到,需要 15 声望分数来支持任何答案。从我的知识来看,或者更确切地说,在编程领域缺乏它,我认为我永远不会有 15 名声望。也许几年后:P
    • 您能否解释一下,如果我想在该文件中保存多个对象,我该怎么做?例如,我如何将两个位置以及我的布尔值保存在那里,我将如何控制哪个是哪个,因为我不完全理解这一点。 (我假设保留我已经拥有的两个属性,并且这个序列化对象保存毫无意义,所以我想将所有内容都保存为序列化)
    • 您可以保存任意数量的对象以及所需的任何类型,然后您可以按照它们被写入的顺序将它们从文件中加载回来。因此,如果您同时保存 BooleanPosition 数组,则可以按该顺序将它们放回原处。我会更新我的答案。
    【解决方案2】:

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

    如果没有你的 Position 类的来源,我将无能为力。

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多