Quel est le moyen le plus simple d’avoir une implémentation de fichier personnalisée utilisant uniquement la mémoire en Java?

StackOverflow https://stackoverflow.com/questions/804814

  •  03-07-2019
  •  | 
  •  

Question

J'ai une base de code qui utilise beaucoup de fichiers pour représenter un seul objet de données. J'ai refactoré le code afin que l'objet de données soit désormais un objet Java explicite qui cache généralement les interactions avec le système de fichiers sous-jacent. Cependant, nous utilisons quelques outils externes (comme Weka), qui lisent et écrivent des fichiers.

Idéalement, j'aimerais disposer d'une sous-classe de File que je puisse transmettre à ces autres bibliothèques et qui est sauvegardée par un tableau d'octets en mémoire, que ce soit pour la lecture ou l'écriture.

Mes recherches google ont mis en place des fichiers mappés en mémoire, mais ce n’est pas le problème que j’ai, car je ne veux pas de fichier dans le système de fichiers. Existe-t-il déjà des solutions ou devrais-je simplement créer une sous-classe File et remplacer toutes les méthodes faisant référence au système de fichiers réel?

Était-ce utile?

La solution

C’est généralement la raison pour laquelle vous ne devriez jamais écrire de méthodes pour prendre un fichier, sauf si cela est vraiment nécessaire. Vos bibliothèques ne fournissent-elles pas de méthodes prenant un InputStream arbitraire? Dans ce cas, il est facile de passer un ByteArrayInputStream ou tout flux d’entrée lu en mémoire.

Le problème avec le remplacement de fichier est qu’il est peu probable que vous puissiez le remplacer d’une manière qui vous aidera. Par exemple, si la bibliothèque l’ouvre avec un FileInputStream, l’origine des octets est alors vraiment contrôlée par l’implémentation FileInputStream, et non par votre fichier.

Autres conseils

java.io.File est essentiellement un wrapper autour d'une String qui représente un chemin de fichier (il aurait dû s'agir d'une classe finale , mais là vous allez). Donc, vous n’avez pas de chance avec cette approche. Vous pouvez bien sûr créer des fichiers temporaires et des fichiers sur les "disques RAM".

vous devriez plutôt rechercher une implémentation en mémoire de OutputStreams / InputStreams telle que ByteArrayOutputStream avec sa méthode toByteArray () ou ByteArrayInputStream avec le constructeur byte []. si vos données sont représentées plus complexes, vous pouvez implémenter l'interface directement.

Vous devez savoir quelles méthodes de fichier sont utilisées par votre tierce partie et leur implémenter une personnalisation.

Est presque certain que vous ne pourrez pas y arriver car l'objet java.io.File n'est pas responsable de la lecture / écriture du contenu du fichier.

La meilleure approche serait de refactoriser le code afin qu'il ne dépende pas de l'objet File mais du tableau d'octets renvoyé par ce fichier.

La création d'une sous-classe de fichier est possible.

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top