2010-10-13 3 views
4

Je cherche une structure de données identique à ArrayList en Java qui enregistre les éléments sur le disque au lieu de la mémoire. Est-ce que Java a une telle structure de données? MerciComment enregistrer les éléments de la liste sur le disque au lieu de la mémoire en Java

Je veux avoir une structure dynamique qui enregistre des éléments sur la mémoire et lorsque sa taille dépasse une certaine valeur, enregistrer de nouveaux éléments sur le disque jusqu'à ce que la taille passe en dessous de la valeur.

Répondre

8

Vous pouvez le faire vous-même: Sérialiser le ArrayList sur le disque.

Assurez-vous que le contenu de la liste est sérialisable, c'est-à-dire que les objets de la liste doivent implémenter l'interface Serializable.

puis
à écrire dans le fichier:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); 
oos.writeObject(list); 
oos.flush(); 
oos.close(); 

Pour lire le fichier:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); 
List<YourClass> list = ois.readObject(); 
ois.close() 
+0

Je veux avoir une structure dynamique qui permet d'économiser des éléments sur la mémoire et lorsque sa taille dépasse une certaine valeur, enregistrer de nouveaux éléments sur le disque jusqu'à ce que la taille descend en dessous de la valeur. – user468889

+1

Vous devez implémenter vous-même une telle structure.Un Warpper autour d'un ArrayList avec des wrappers pour "ajouter", "remove" et "get" metnods, qui font la vérification que vous dites et sérialiser et désérialiser en fonction des besoins – Nivas

+1

L'exigence est assez spécifique, donc je doute qu'une implémentation existe qui fait exactement ce que tu veux. Comme suggéré ci-dessus, l'écriture de votre propre implémentation List à l'aide d'une ArrayList interne et de la sérialisation d'objets semble être la meilleure solution. Notez que vous devrez implémenter * toutes * les méthodes de List, pas seulement ajouter, supprimer et obtenir. – Qwerky

2

Si vous avez besoin de changer les données dans ce ArrayList souvent, changer l'image du disque, alors pourquoi ne pas envisager quelque chose comme http://www.hibernate.org/? Eh bien, c'est beaucoup plus compliqué que ArrayList mais donne aussi plus de featues.

+0

Je veux avoir une structure dynamique qui enregistre des éléments sur la mémoire et quand sa taille dépasse une certaine valeur, enregistrer de nouveaux éléments sur le disque jusqu'à ce que la taille passe en dessous de la valeur. – user468889

0

Une autre façon d'enregistrer des éléments qui a l'avantage d'être neutre en termes de langue et de transport est d'utiliser le Protocol Buffers de Google.

2

Juste pour faire l'ensemble des réponses complètes :)

XStream

XStream est une bibliothèque simple à objets sérialisation XML et à dos encore.

Person joe = new Person("Joe", "Walnes"); 
joe.setPhone(new PhoneNumber(123, "1234-456")); 
joe.setFax(new PhoneNumber(123, "9999-999")); 

Maintenant, pour le convertir en XML, tout ce que vous devez faire est de faire un simple appel à XStream:

String xml = xstream.toXML(joe); 

Le XML résultant ressemble à ceci:

<person> 
    <firstname>Joe</firstname> 
    <lastname>Walnes</lastname> 
    <phone> 
    <code>123</code> 
    <number>1234-456</number> 
    </phone> 
    <fax> 
    <code>123</code> 
    <number>9999-999</number> 
    </fax> 
</person> 
1

MapDB (mapdb.org) est une bibliothèque qui conserve les objets Java sur disque dans diverses collections: Ensembles, cartes, files d'attente.

Il prend en charge la mise en cache afin que vous puissiez conserver vos éléments les plus fréquents en mémoire.

0

voir https://dzone.com/articles/a-filebasedcollection-in-java-for-big-collections

try(FileBasedCollection<Integer> fbc = new FileBasedCollection<>()) { 
    for(int i = 1; i < 1000_000; i++) { 
    fbc.add(i); 
    } 
    long sum = 0; 
    try(FileBasedIterator<Integer> iter = fbc.iterator()) { 
    while(iter.hasNext()) { 
     Integer i = iter.next(); 
     sum += i; 
    } 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    System.out.println("sum: " + sum); 
} 
Questions connexes