FileNotFoundException en la apertura de FileOutputStream el mismo archivo lee usando java nio

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

  •  23-09-2019
  •  | 
  •  

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?

¿Fue útil?

Solución

Stephen C le dijo que desasignar la memoria intermedia.

Sin embargo, aquí hay una enlace a todavía abierto (desde 2002) solicitud de método MappedBybeBuffer.unmap.

Tiene algunas soluciones sugeridas, por lo que puede probarlos.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top