0

我有一个对象数组列表,有人可以告诉我从文件中写入和检索对象的最有效方法吗?

谢谢。

我的尝试

 public static void LOLadd(String ab, String cd, int ef) throws IOException {
     MyShelf newS = new MyShelf();
     newS.Fbooks = ab;
     newS.Bbooks = cd;
     newS.Cbooks = ef;
     InfoList.add(newS);

         FileWriter fw;
                 fw = new FileWriter("UserInfo.out.txt");
             PrintWriter outt = new PrintWriter(eh);
                 for (int i = 0; i <InfoList.size(); i++)
                 {
                     String ax = InfoList.get(i).Fbooks;
                     String ay = InfoList.get(i).Bbooks;
                     int az = InfoList.get(i).Cbooks;
                     output.print(ax + " " + ay + " " + az);  //Output all the words to file // on the same line
                     output.println(""); //Make space
                 }
                 fw.close();
                 output.close();
}

我尝试检索文件。另外,在检索文件后,如何读取每一列对象?例如,如果我有 ::::: Fictions, Dramas, Plays --- 我如何读取、获取、替换、删除和向 Dramas 列添加值?

public Object findUsername(String a) throws FileNotFoundException, IOException,     ClassNotFoundException  
{    
 ObjectInputStream sc = new ObjectInputStream(new FileInputStream("myShelf.out.txt"));

    //ArrayList<Object> List = new ArrayList<Object>();
    InfoList = null;
    Object  obj = (Object) sc.readObject();

    InfoList.add((UserInfo) obj);
    sc.close();

     for (int i=0; i <InfoList.size(); i++) {
          if (InfoList.get(i).user.equals(a)){
               return "something" + InfoList.get(i);
      }
   }
     return "doesn't exist"; 
 }

public static String lbooksMatching(String b)    {

    //Retrieve data from file
    //...

    for (int i=0; i<myShelf.size(); i++)       {
        if (myShelf.get(i).user.equals (b))   
        {
            return b;
        }
        else 
        {
            return "dfbgregd"; 
        }
   }
    return "dfgdfge"; 
}

public static String matching(String qp)    {
    for (int i=0; i<myShelf.size(); i++)       {
        if (myShelf.get(i).pass.equals (qp))   
        {
            return c;
        }
        else 
        {
            return "Begegne"; 
        }
   }
    return "Bdfge"; 
}

谢谢!!!

4

2 回答 2

3

似乎您想要序列化一个对象并将序列化形式保存到某种存储(在本例中为文件)。

这里有 2 条重要说明:

序列化

内部java序列化

  • Java 提供了自动序列化,它要求通过实现 java.io.Serializable 接口来标记对象。实现接口将类标记为“可以序列化”,然后 Java 在内部处理序列化。
  • 有关如何将对象序列化/反序列化到字节的代码示例,请参见这篇文章。

这可能永远是持久化对象的理想方式,因为您无法控制格式(由 java 处理),它不是人类可读的,并且如果您的对象发生更改,您可以控制版本问题。

编组为 JSON 或 XML

  • 将对象序列化到磁盘的更好方法是使用另一种数据格式,如 XML 或 JSON。
  • 可以在此处找到有关如何将对象转换为 JSON 结构的示例。

重要提示:除非有很好的理由(我在这里看不到),否则我不会像您那样在代码中进行序列化。它很快就会变得混乱,并且当您的对象发生变化时会发生变化。我会选择一种更自动化的序列化方式。此外,当使用 JSON / XML 等格式时,您知道有大量 API 可用于读取/写入该格式,因此您不再需要实现所有这些序列化/反序列化逻辑。

持久性

由于各种原因(没有版本控制/并发问题/.....),将您的序列化对象写入文件并不总是一个好主意。

更好的方法是使用数据库。如果它是一个分层数据库,请查看 Hibernate 或 JPA 以使用很少的代码来持久化您的对象。如果它是像 MongoDB 这样的文档数据库,则可以持久化 JSON 序列化表示。

有大量的资源可用于将对象持久化到 Java 中的数据库。我建议查看JPA,这是用于持久性和对象/关系映射的标准 API。

于 2013-03-22T15:40:43.427 回答
0

这是另一个基本示例,它将让您深入了解 Arraylist、构造函数以及将输出写入文件: 运行此程序后,如果您使用 IDE 转到项目文件夹,您将在其中生成 *.txt 文件。

import java.io.*;
import java.util.List;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ListOfNumbers {

    private List<Integer> list;
    private static final int SIZE = 10;//whatever size you wish

    public ListOfNumbers () {
        list = new ArrayList<Integer>(SIZE);
        for (int i = 0; i < SIZE; i++) {
            list.add(new Integer(i));
        }
    }

    public void writeList() {
        PrintWriter out = null;
        try {
            out = new PrintWriter(new FileWriter("ManOutFile.txt"));
            for (int i = 0; i < SIZE; i++) {
                out.println("Value at: " + i + " = " + list.get(i));
            }
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(ListOfNumbers.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
public static void main(String[] args)
{
    ListOfNumbers lnum=new ListOfNumbers();
    lnum.writeList();
}
}
于 2013-05-14T07:24:33.727 回答