FileNotFoundException lors de l'ouverture sur FileOutputStream même fichier lu en utilisant java nio

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

  •  23-09-2019
  •  | 
  •  

Question

J'ai un éditeur de texte qui utilise le code presque identique à ci-dessous pour la lecture et l'écriture. Quand j'ouvre de petits fichiers pour Editting, je reçois toujours cette erreur lorsque je tente de les sauver à nouveau. La chose vraiment intéressante est bien que mon éditeur de texte fonctionne très bien pour les fichiers avec environ 600 octets ou plus (semble varier chaque fois), le comportement que je ne l'ai pas été en mesure de reproduire ici.

Ma solution actuelle est de vérifier la taille du fichier <1024 octets, et utiliser java.io si tel est le cas.

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 ce travail tout en lisant toujours avec nio?

Était-ce utile?

La solution

Stephen C vous a dit de la mémoire tampon unmap.

Cependant, voici un pour toujours ouvert (de 2002) demande de procédé de MappedBybeBuffer.unmap.

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

Autres conseils

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

Le Javadoc map(...) dit ceci:

  

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

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