2010-07-08 3 views
4

Quelle est la meilleure façon de partager un fichier entre deux services «writer» dans la même application?Verrouillage d'un fichier sur plusieurs services

Editer: Désolé, j'aurais dû donner plus de détails, je suppose.

J'ai un service qui enregistre les entrées dans un tampon. Lorsque le tampon est plein, il écrit toutes les entrées dans le fichier (et ainsi de suite). Un autre service en cours d'exécution viendra à un moment donné et lire le fichier (essentiellement copier/compresser), puis le vider.

+0

J'ai mis à jour ma réponse ... laissez-moi savoir si c'est dans le sens de ce que vous cherchez. – Kiril

Répondre

2

Voici une idée générale de ce que vous pouvez faire:

public class FileManager 
{ 
    private final FileWriter writer = new FileWriter("SomeFile.txt"); 
    private final object sync = new object(); 

    public void writeBuffer(string buffer) 
    { 
     synchronized(sync) 
     { 
      writer.write(buffer.getBytes()); 
     } 
    }   

    public void copyAndCompress() 
    { 
     synchronized(sync) 
     { 
      // copy and/or compress 
     } 
    } 

} 

Vous devez faire un travail supplémentaire pour obtenir tout de travailler en toute sécurité, mais cela est juste un exemple de base pour vous donner une idée de quoi ça a l'air.

+0

Merci, mais je ne pense pas que ce soit ce que je cherchais. Je mettrai à jour le premier message pour donner plus de détails. Désolé :) – charisk

+0

@roul, ok J'ai mis à jour la réponse en fonction de votre clarification. – Kiril

+0

Je voulais éviter quelque chose comme ça pour être honnête :) mais je ne peux pas penser à autre chose pour le moment. Dans mon cas, puisque j'ai des services android, le verrou d'objet et les méthodes devraient probablement être statiques et les services feraient des appels au FileManager. – charisk

0

Une méthode courante de verrouillage consiste à créer un deuxième fichier au même emplacement que le fichier principal. Le deuxième fichier peut contenir des données de verrouillage ou être vide. L'avantage d'avoir des données de verrouillage (comme un ID de processus) est que vous pouvez facilement détecter un fichier de verrouillage éventé, ce qui est inévitable, vous devez planifier. Bien que PID ne soit pas la meilleure des données de verrouillage dans votre cas.

exemple: Service1:

  • crée myfile.lock
  • crée/ouvre myfile

Service2:

  • Avis que myfile.lock est présente et pauses/blocs/attend
  • Lorsque myfile.lock disparaît, il le crée, puis ouvre myfile.

Il serait également avantageux pour vous revérifier que le fichier contient vos informations de verrouillage (identification spécifique à votre service) juste après l'avoir créé - juste au cas où deux ou plusieurs services sont en attente et de créer une serrure à exactement le même temps. Le dernier réussit et tous les autres services doivent remarquer que leurs données de verrouillage ne sont plus dans le fichier. Aussi - mettre en pause quelques millisecondes avant de vérifier son contenu.

+0

Solution intéressante mais je ne vois pas comment je pourrais l'utiliser dans mon cas.Merci quand même. – charisk

+0

Je vois. Ma solution serait appropriée pour plusieurs applications mais je vois que vous synchronisez des processus au sein de votre application. J'étais confus parce que vous les appeliez "services". Je suis d'accord avec la réponse acceptée - le mot clé 'synchronized' serait approprié dans votre cas. –

Questions connexes