FileNotFoundException en la apertura de FileOutputStream el mismo archivo lee usando java nio
Pregunta
Tengo un editor de texto que el código de usos casi idéntica a la de abajo para la lectura y la escritura. Cuando abro archivos pequeños para editting, siempre me sale este error cuando intento volver a grabarlas. Lo realmente interesante es que mi editor de texto bien funciona para archivos con cerca de 600 bytes o más (parece variar cada vez), comportamiento que no he sido capaz de reproducir aquí.
Mi solución actual es comprobar que el tamaño del archivo <1024 bytes, y el uso java.io si ese es el 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();
}
}
}
En el código anterior, me sale este error para diferentes tamaños de test.txt de 4 bytes 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)
Puede alguien explicar lo que estoy haciendo mal y cómo puedo conseguir que esto funcione al mismo tiempo la lectura con nio?
Otros consejos
Es necesario explícitamente unmap la región que ha correlacionado con la llamada FileChannel.map(...)
.
El Javadoc para map(...)
dice lo siguiente:
Un mapeo, una vez establecido, no depende de la canal de archivo que se utilizó para crearlo. Cierre de la canal, en particular, no tiene efecto sobre la validez de la asignación.