J'essaie de mettre en œuvre l'opération suivante en Java et je ne suis pas sûr de savoir comment:
/*
* write data (Data is defined in my package)
* to a file only if it does not exist, return success
*/
boolean writeData(File f, Data d)
{
FileOutputStream fos = null;
try
{
fos = atomicCreateFile(f);
if (fos != null)
{
/* write data here */
return true;
}
else
{
return false;
}
}
finally
{
fos.close(); // needs to be wrapped in an exception block
}
}
5 Réponses :
fichier. Creeenewfile () Code> crée uniquement un fichier si on n'existe pas déjà. p>
Edit: En fonction de votre nouvelle description de vouloir verrouiller le fichier après sa création, vous pouvez utiliser le java.nio.channel.filelock code> objet pour verrouiller le fichier. Il n'y a pas une ligne de création et de verrouille si vous espérez. Aussi, voyez ceci donc Question . < / p>
Doh! Comment ça m'a manqué? :/ Merci. Mon esprit a été dans la terre C ++.
OK merci. Eh bien, cela ressemble à je dois réfléchir attentivement à des conditions exceptionnelles. (E.G. Si le Creeenewfile () réussit mais ouvrir un canal de fichier et obtenir un verrouillage de fichier échoue)
atomique fort> crée un nouveau fichier vide nommé par ce chemin d'accès abstrait si et seulement si strong> un fichier avec ce nom
n'existe pas encore fort>. La vérification de l'existence du fichier et de la création du fichier si elle n'existe pas est une opération unique qui est atomique en ce qui concerne toutes les autres activités de système de fichiers susceptibles d'affecter le fichier. Em> p> blockQuote>
Modifier strong> p> Jason, quant à votre préoccupation, si vous continuez à lire le lien que nous vous avons envoyé qu'il y a une note à ce sujet. P>
Remarque: strong> Cette méthode ne doit pas être utilisée pour le verrouillage du fichier, car le protocole résultant ne peut pas être apporté de manière fiable. Filelock doit être utilisé à la place. em> p> blockQuote>
Je pense que vous devriez vraiment lire cette partie aussi: p>
Merci, j'ai lu la note, c'est ce qui a déclenché l'euh oh.
(Malheureusement, il ne semble pas que ce ne semble pas être un référentiel de paradigmes Java I / O, en dehors de l'exploration manuelle de la plate-forme Javadocs, qui dit que tous les outils que vous disposez ... Fichier et Filelock sont des forfaits complètement différents, parfois vous Utilisez FileChannel, parfois vous utilisez FileOutPutStream ... me fait parfois tourner la tête.)
J'ai trouvé celui-là aussi, mais je n'utilise pas le fichier comme une serrure, je veux juste être sûr à 100% que si j'écris au fichier, je suis le premier, et personne d'autre ne le touche J'y écris.
Pourquoi ne pouvez-vous pas tester en utilisant # # existe ? P>
Parce qu'entre le temps que vous testez à l'aide de fichier.exists (), et vous allez créer un fichier si cela n'existe pas, quelqu'un d'autre aurait peut-être créé le fichier en premier.
Parce qu'entre l'heure existe () code> renvoie false et il construit le fichier FileOutPutStream code> Un autre processus pourrait passer et créer le fichier. Une condition de course classique.
(De la même manière que j'ai glissé dans ce commentaire juste devant Joachim. :-)
Excellente démonstration, en effet ;-)
//myFile should only be created using this method to ensure thread safety
public synchronized File getMyFile(){
File file = new File("path/to/myfile.ext");
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
return file;
}
J'ai changé le paramètre sur le constructeur de fichiers à une chaîne réelle au cas où il s'agissait d'échec.
Lorsque le système crée un fichier, il aura une poignée «LOCK».
Lorsque vous écrivez dans le fichier, il doit également obtenir une poignée sur l'objet de fichier afin qu'aucun autre thread ne puisse y accéder ou le supprimer. Vous pourriez écrire un test Junit pour confirmer cela. Si vous rencontrez des problèmes, vous pouvez exécuter vos opérations dans un bloc synconze () {}.
Lire Réponse de Geo et les commentaires associés.
Ce fichier est un singleton alors? Je ferais la méthode synchronisée dans ce cas de la manière dont un seul thread peut y accéder à la fois.
J'écrivais un autre échantillon de code dans une réponse séparée, mais j'ai bien peur que vous ne feriez plus de points de réputation - alors je pense que je vais simplement rester en dehors de ce post puisque les exigences ne sont pas très clairement définies.