使数据结构持久化

时间:2017-07-17 07:53:15

标签: java data-structures linked-list tree

我在JAVA中读取文件并根据用户规范,将数据转换为链接列表或树,但如何将数据保存到文件中(作为数据结构),以便下一步时间我读取数据,我没有额外的努力来解析文件。

3 个答案:

答案 0 :(得分:0)

  

您可以将这样的数据保存到文件中,它不是链接列表,但有助于理解

//save persons
public void savePersons(){
try{
    PersonsInfo p;
    String line;
    FileWriter fw= new FileWriter("input.txt");
    PrintWriter pw= new PrintWriter(fw);
    for (int i=0 ; i<persons.size();i++){
        p =(PersonsInfo)persons.get(i);
        line = p.getName() +","+ p.getAddress() +","+ p.getPhoneNum();
        pw.println(line);
    }
    pw.flush();
    pw.close();
    fw.close();
} catch (IOException ioEx){
System.out.println(ioEx);   
}   
  

你可以检索这样的数据,你不需要每次都解析文件

public class AddressBook{
ArrayList<PersonsInfo> persons;
public AddressBook (){
    persons = new ArrayList <PersonsInfo> ();
    loadPersons();
}
//Load Person
public void loadPersons (){
String tokens[]=null;
String name,address,phoneNum;
try{
    FileReader fr= new FileReader("input.txt");
    BufferedReader br= new BufferedReader(fr);
    String line=br.readLine();
    while (line !=null)
    {
        tokens = line.split(",");
        name=tokens[0];
        address=tokens[1];
        phoneNum=tokens[2];
        PersonsInfo p = new PersonsInfo(name,address,phoneNum);
        persons.add(p);
        line = br.readLine();
    }

br.close();
fr.close();

}catch (IOException ioEx) {
        System.out.println(ioEx);
}   
}

答案 1 :(得分:0)

这取决于您希望如何存储数据:

  • 如果您不希望数据以人类可读的形式存储,那么您可以继续使用Serialization(示例here)。 Java将分别在写/读操作期间处理存储/构造对象/结构。
  • 如果您想以人类可读的形式存储数据,那么您可以将数据转换为let {'1}}并将其存储为String格式。您可以使用杰克逊的json类,例如:

    ObjectMapper

    ObjectMapper mapper = new ObjectMapper(); YourClass object = new YourClass(); FileOutputStream outputStream = new FileOutputStream("path_to_file"); outputStream.write(mapper.writeValueAsBytes(object));

    Here's示例和此处的Jackson's文档。

答案 2 :(得分:0)

您可以使用serialization这是一个非常容易使用的Java功能:

保存:

ObjectOutputStream oos = null;
try {
      LinkedList<String> list = new LinkedList<>();  
      list.add("toto");  list.add("tata");

      oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\..\\Doc\\list.ser"));
      oos.writeObject(list);
} catch ... {
}finally (oos.close) ...{
}

当然,如果不是你将LinkedList更改为你想要的任何内容

加载

ObjectInputStream ois = null;

try {
    ois = new ObjectInputStream(new FileInputStream("C:\\Users\\..\\Doc\\list.ser"));

    final LinkedList<String> list = (LinkedList<String>) ois.readObject();
    System.out.println(list.toString());   //[toto,tata]
} catch ... {
}finally (ois.close) ...{
}

在写作时,你使用writeObject并在阅读时使用readObject + casting到好的类型(所以顺序很重要,如果你写一个List然后是字符串然后其他,你可以读List然后String然后其他)

Serialization Details