Est-ce que le code Java suivant garantit et un verrouillage exclusif sur un fichier non ouvert sous Windows?

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

Question

Le code Java suivant garantit-il une serrure exclusive sur un fichier non ouvert dans Windows?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        File file = new File("mylog.log");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.getChannel().lock();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Était-ce utile?

La solution

Comme on peut le voir dans les spécifications Java:

Les serrures de fichier sont conservées pour le compte de l'ensemble de la machine virtuelle Java.Ils ne conviennent pas au contrôle de l'accès à un fichier par plusieurs threads dans la même machine virtuelle.

Donc, si vous avez besoin d'une serrure exclusive pour le fil, veuillez choisir une autre manière.

Autres conseils

TL; DR: Non. Vous ne pouvez pas faire d'hypothèses sur le comportement du traitement du système d'exploitation hôte de vos serrures.

bonne nouvelle: essayez-vous de vous assurer que vous disposez d'un mécanisme de verrouillage de fil à fil dans votre application? Si tel est le cas, FileLock est suffisant (en supposant que le reste de l'application est composé d'un code de sécurité à filetage correctement écrit, bien sûr).

mauvaises nouvelles: Malheureusement, si vous essayez de vous assurer que Windows respectera votre verrouillage sur toutes les applications, vous ne pouvez pas compter sur cela.

Ceci est facile à observer dans Windows: vous pouvez souvent écraser les fichiers qui sont écrits (lorsque les fichiers journaux sont trop longs, j'ai des emacs hacher tout le spam précédent, par exemple). Cela dit, Windows ne vous permettra généralement pas de supprimer un fichier ouvert.

:

Les serrures de fichier sont conservées pour le compte de la Toute la machine virtuelle Java. Elles sont ne convient pas pour contrôler l'accès à un fichier par plusieurs threads dans le même machine virtuelle.

Les objets de verrouillage du fichier sont sans danger pour une utilisation par Threads simultanés multiples.

... et plus tard ...

Si un verrou soit ou non empêche un autre programme de Accéder au contenu du verrouillé la région est dépendante du système et donc non spécifié. Le natif installations de verrouillage du fichier de certains Les systèmes sont simplement consultatifs, ce qui signifie que les programmes doivent coopératier observer un protocole de verrouillage connu dans afin de garantir l'intégrité des données. Au Autres systèmes Les serrures de fichiers natifs sont obligatoire, ce qui signifie que si un programme verrouille une région d'un fichier puis autre les programmes sont effectivement empêchés de accéder à cette région de manière à violerait la serrure. Sur encore autre systèmes, que les serrures de fichier natif sont Un conseil ou obligatoire est configurable sur une base par fichier. S'assurer comportement cohérent et correct à travers plates-formes, il est fortement recommandé que les serrures fournies par cette API soient utilisé comme s'il s'agissait de serrures de conseil.

Même si vous utilisez des drapeaux de verrouillage et de déverrouillage pour le fichier, vous garantissez uniquement que vous avez une serrure exclusive dans votre application Java .

.

Vous devez soit utiliser le JNI, soit un autre langage informatique, pour rendre les appels Windows pour garantir une serrure exclusive sur un fichier Windows.

windows Fonction Lockfile

windows FONCTION DE DÉVOIRFILE

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top