FileNotFoundException in apertura FileOutputStream su stesso file leggere Utilizzo di Java NIO

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

  •  23-09-2019
  •  | 
  •  

Domanda

Ho un editor di testo che utilizza il codice quasi identico al di sotto per la lettura e la scrittura. Quando apro file di piccole dimensioni per editting, ho sempre arrivare questo errore quando provo a salvare di nuovo. La cosa veramente interessante è però che il mio editor di testo funziona bene per i file con circa 600 byte o più (sembra variare di volta in volta), comportamento che non sono stato in grado di replicare qui.

La mia soluzione attuale è quella di verificare la presenza di file di dimensioni <1024 byte, e utilizzare java.io se questo è il caso.

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();
        }
    }
}

Per il codice di cui sopra, ottengo questo errore per vari formati di test.txt da 4 byte a 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)

Qualcuno può spiegare che cosa sto facendo di sbagliato e come posso ottenere questo al lavoro, mentre ancora la lettura con nio?

È stato utile?

Soluzione

Stephen C ti ha detto di eliminare la mappatura dei buffer.

Tuttavia, qui è un link a ancora aperti (dal 2002) richiesta per il metodo MappedBybeBuffer.unmap.

Ha un paio di soluzioni alternative suggerite, quindi si può provare.

Altri suggerimenti

È necessario eliminare la mappatura in modo esplicito la regione che si è mappato con la chiamata FileChannel.map(...).

Il Javadoc per map(...) dice questo:

  

Una mappatura, una volta stabilita, non dipende dal canale di file che è stato utilizzato per crearlo. La chiusura del canale, in particolare, non ha alcun effetto sulla validità della mappatura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top