2017-07-17 79 views
-1

我在JAVA中读取一个文件并根据用户规范将数据转换为链接列表或树,但是如何将数据保存到文件中(作为数据结构) ,所以下次我读取数据时,我不必花费额外的精力来解析文件。使数据结构持久

+0

您可以使用序列化的文件中写入的树,然后反序列化它,当你想读它。 – Slimu

回答

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); 
} 
} 
0

这取决于你想如何存储数据解析文件:

  • 如果您不想将数据存储在人类可读的形式,那么你可以用Serialization(例如here)继续。 Java将分别在写/读操作期间负责存储/构造对象/结构。
  • 如果你想以人类可读的形式存储数据,那么你可以将数据转换成比如json并以String格式存储它。您可以使用杰克逊的ObjectMapper类,例如:

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

    //Read YourClass persisted = mapper.readValue("path_to_file", YourClass.class);

    Here's的例子,这里是Jackson's文档。

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向好的类型(这样的顺序是非常重要的,如果你写了一个名单,然后字符串,然后其他的,你可以阅读列表此后字符串,然后其他)

Serialization Details