Cet article explique 5 méthodes pour résoudre la rédaction de fichiers exclusive de Java, y compris une partie de votre propre compréhension. S'il y a une inappropriation, vous êtes invités à le proposer.
Solution 1: Utilisez l'option de fonctionnement du fichier de RandomAccessFile , s signifie écrire en mode verrouillage de synchronisation
RandomAccessFile file = new randomaccessfile (fichier, "rws");
Solution 2: Utilisez le verrouillage de fichiers de FileChannel
File file = new File ("test.txt"); fileInputStream fis = new FileInputStream (fichier); fileChannel Channel = fis.getChannel (); filelock filelock = null; while (true) {filelock = channel.trylock (0, long.max_value, false); // Vrai signifie un verrou partagé, false est un verrou exclusif if (filelock! = null) Break; else // il y a d'autres fils qui occupent le sommeil de serrure (1000);} Solution 3: Écrivez d'abord le contenu à écrire dans un fichier temporaire, puis modifiez le nom du fichier temporaire (le schéma de piratage utilise le principe de l'opération tampon + atomique )
classe publique MyFile {Private String FileName; public myfile (string filename) {this.fileName = filename; } public synchronisé void writeData (data de chaîne) lève ioException {String tmpFileName = uuid.randomuuid (). toString () + ". tmp"; File tmpFile = nouveau fichier (tmpFileName); FileWriter fw = new FileWriter (tmpFile); fw.write (données); fw.flush (); fw.close (); // Renommer maintenant le fichier temporaire au nom souhaité, cette opération est une opération atomique sous la plupart des os if (! tmpfile.renameto (nom de fichier) {// Nous voulons peut-être réessayer si le mouvement échoue à lancer une nouvelle ioException ("Move Faich");}}} Solution 4: encapsuler le fichier en fonction du chemin du fichier et utiliser synchronisé pour contrôler l'écriture du fichier
classe publique MyFile {Private String FileName; public myfile (string filename) {this.fileName = filename; } public synchronisé void writeData (String data) lève ioException {filewriter fw = new FileWriter (filename); fw.write (données); fw.flush (); fw.close (); }} Plan 5: Un plan que j'ai trouvé n'est pas très précis. En changeant pour définir le contrôle de la lecture et de l'écriture d'autorisation, simulez la définition d'un marqueur en écriture (transformé en un problème de lecture et d'écriture classique dans le système d'exploitation ...)
classe publique MyFile {private volatile boolean canwrite = true; Nom de fichier de chaîne privée; public myfile (string filename) {this.fileName = filename; } public void writeData (String data) {while (! canWrite) {try {thread.sleep (100); } catch (InteruptedException IE) {} // Vous pouvez définir un temps d'écriture de temps mort} canWrite = false; // Écrivez maintenant le fichier canWrite = true; }}Ce qui précède est la solution à Java écrivant exclusivement des fichiers. L'avez-vous appris? Vous pouvez vous référer à d'autres articles pour l'apprendre et le comprendre.