comment créer un fichier en Java que si l'on n'en existe pas déjà?
Je suis en train 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
}
}
Est-il une fonction qui existe déjà que je peux utiliser pour atomicCreateFile()
?
edit: Uh oh, je ne suis pas sûr de ce Fichier.createNewFile() est suffisant pour mes besoins. Ce que si je l'appelle f.createNewFile()
et puis entre le temps qu'il renvoie et j'ouvre le fichier en écriture, quelqu'un d'autre a supprimé le fichier? Est il possible que je peux à la fois de créer le fichier et l'ouvrir à la rédaction + verrouiller, le tout d'un seul coup? Ai-je besoin de vous inquiéter à ce sujet?
OriginalL'auteur Jason S | 2009-10-12
Vous devez vous connecter pour publier un commentaire.
Fichier.createNewFile()
seulement crée un fichier s'il n'existe pas déjà.EDIT: en Fonction de votre nouvelle description de vouloir verrouiller le fichier après l'avoir créé, vous pouvez utiliser le
java.nio.les canaux.FileLock
objet de verrouiller le fichier. Il n'y a pas une seule ligne de créer et de verrouiller même si, comme vous êtes l'espoir. Aussi, de voir cette SI question.mise à jour de ma réponse basée sur votre modifier
ok, merci. Eh bien, il sonne comme j'ai besoin de réfléchir attentivement à des conditions exceptionnelles. (par exemple, si le createNewFile() réussit, mais l'ouverture d'un fichier de canal et l'obtention d'un fichier de verrouillage échoue)
OriginalL'auteur Taylor Leese
Fichier.createNewFile()
MODIFIER
Jason, pour votre sollicitude, si vous continuez à lire le lien que nous vous avons envoyé il y a une NOTE à ce sujet.
Je pense que vous devriez vraiment lire cette partie trop:
Merci, je n'ai lu la note, c'est ce qui a déclenché l'Uh oh.
(Malheureusement, il ne semble pas être un référentiel de Java I/O paradigmes, à côté de la main à explorer la plate-forme de documentation javadoc, qui dit que ce sont tous les outils dont vous disposez... de Fichiers et FileLock sont complètement différents forfaits, il faut parfois utiliser des FileChannel, parfois, vous utilisez FileOutputStream... me fait tourner la tête parfois.)
Comme un almanach ? 🙂 exampledepot.com/egs/java.nio/SetFileLock.html
J'ai trouvé celui-là aussi, mais je ne suis pas en utilisant le fichier comme un verrou, je veux juste être sûr à 100% que si je écrire dans le fichier, je suis la première à le faire, et personne d'autre est de le toucher alors que je suis en train d'écrire.
OriginalL'auteur OscarRyz
Java 7 version avec Les fichiers#createFile:
OriginalL'auteur Stephan
Pourquoi ne pouvez-vous pas de test à l'aide de Fichier#existe?
Parce que entre le moment
exists()
renvoie la valeur false et il construit leFileOutputStream
certains autres processus pourraient faire le saut et à la création du fichier. Un classique de la condition de course.(de la même façon, j'ai glissé dans ce commentaire, juste en avant de Joachim. 🙂
Excellente démonstration, en effet 😉
OriginalL'auteur Geo
Lorsque le système est la création d'un fichier, il aura une poignée aka "lock" sur elle.
Lorsque vous écrivez dans le fichier il doit également obtenir une poignée sur le Fichier de l'objet de sorte qu'aucun autre thread ne peut y accéder ou de les supprimer.Vous pourriez écrire un test Unitaire pour le confirmer. Si vous rencontrez des problèmes vous pouvez exécuter vos opérations dans un synconized(){} bloc.
Lire Geo réponse et les commentaires associés.
Ce fichier est un singleton, alors? Je voudrais faire de la méthode synchronisée dans ce cas, de cette façon, un seul thread peut accéder à la fois.
OriginalL'auteur cosbor11