2010-01-27 3 views
2

J'ai un éditeur de texte qui utilise un code presque identique à celui ci-dessous pour la lecture et l'écriture. Lorsque j'ouvre de petits fichiers pour les éditer, je reçois toujours cette erreur lorsque j'essaie de les sauvegarder à nouveau. La chose vraiment intéressante est que mon éditeur de texte fonctionne bien pour les fichiers d'environ 600 octets ou plus (semble varier à chaque fois), comportement que je n'ai pas pu reproduire ici. Ma solution de contournement actuelle consiste à vérifier la taille du fichier < 1024 octets, et d'utiliser java.io si c'est le cas.FileNotFoundException à l'ouverture FileOutputStream sur le même fichier lu en utilisant java nio

import java.io.*; 
import java.nio.*; 
import java.nio.channels.*; 
import java.nio.charset.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = null; 
     try { 
      FileInputStream fis = new FileInputStream("test.txt"); 
      FileChannel ifc = fis.getChannel(); 
      CharBuffer cb = Charset.forName("ISO-8859-15").newDecoder(). 
        decode(ifc.map(FileChannel.MapMode.READ_ONLY, 0, 
        (int) ifc.size())); 
      text = cb.toString(); 
      ifc.close(); 
      fis.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

     try { 
      FileOutputStream fos = new FileOutputStream("test.txt"); 
      OutputStreamWriter osw = new OutputStreamWriter(
        fos, "ISO-8859-15"); 
      osw.write(text); 
      osw.close(); 
      fos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Pour le code ci-dessus, je reçois cette erreur pour différentes tailles de test.txt de 4 octets à 10kb:

java.io.FileNotFoundException: test.txt (The requested operation cannot be perfo 
rmed on a file with a user-mapped section open) 
     at java.io.FileOutputStream.open(Native Method) 
     at java.io.FileOutputStream.<init>(Unknown Source) 
     at java.io.FileOutputStream.<init>(Unknown Source) 
     at Test.main(Test.java:23) 

Quelqu'un peut-il expliquer ce que je fais mal et comment je peux obtenir ceci pour travailler tout en lisant avec nio?

Répondre

2

Stephen C vous a dit de démapper le tampon.

Cependant, voici une requête de link à STILL OPEN (à partir de 2002) pour la méthode MappedBybeBuffer.unmap.

Il y a quelques solutions de contournement suggérées, alors vous pouvez les essayer.

0

Vous devez explicitement démapper la région que vous avez mappée avec l'appel FileChannel.map(...).

Le Javadoc pour map(...) dit ceci:

Une cartographie, une fois établie, ne dépend pas du canal de fichier qui a été utilisé pour créer. La fermeture du canal, en particulier, n'a aucun effet sur la validité de la cartographie.

Questions connexes