FileNotFoundException in apertura FileOutputStream su stesso file leggere Utilizzo di Java NIO
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?
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.