FileNotFoundException ao abrir FileOutputStream no mesmo arquivo lido usando java nio

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

  •  23-09-2019
  •  | 
  •  

Pergunta

Tenho um editor de texto que usa código quase idêntico ao abaixo para leitura e escrita.Quando abro arquivos pequenos para edição, sempre recebo esse erro quando tento salvá-los novamente.O que é realmente interessante é que meu editor de texto funciona bem para arquivos com cerca de 600 bytes ou mais (parece variar a cada vez), comportamento que não consegui replicar aqui.

Minha solução atual é verificar o tamanho do arquivo <1024 bytes e usar java.io, se for o 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();
        }
    }
}

Para o código acima, recebo este erro para vários tamanhos 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)

Alguém pode explicar o que estou fazendo de errado e como posso fazer isso funcionar enquanto ainda leio com o nio?

Foi útil?

Solução

Stephen c Disse para você unificar o buffer.

No entanto, aqui está um link Para ainda abrir (de 2002), a solicitação para o método MappEdByBeBuffer.unmap.

Ele tem algumas soluções alternativas sugeridas, então você pode experimentá -las.

Outras dicas

Você precisa desmapear explicitamente a região mapeada com o FileChannel.map(...) chamar.

O Javadoc para map(...) diz isto:

Um mapeamento, uma vez estabelecido, não depende do canal de arquivo usado para criá-lo.O fechamento do canal, em particular, não afeta a validade do mapeamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top