FileNotFoundException auf Fileoutputstream auf der gleichen Datei zu öffnen lesen java nio mit

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

  •  23-09-2019
  •  | 
  •  

Frage

Ich habe einen Texteditor, dass Verwendungen Code fast identisch mit dem unten zum Lesen und Schreiben. Als ich klein-Dateien für editting öffne, bekomme ich immer diese Fehlermeldung, wenn ich versuche wieder, sie zu retten. Die wirklich interessante Sache ist aber, dass mein Text-Editor gut für Dateien mit ca. 600 Byte oder mehr arbeitet (scheint jedes Mal zu variieren), Verhalten, dass ich nicht in der Lage, hier zu replizieren.

Meine aktuelle Problemumgehung ist für die Dateigröße <1024 Bytes zu überprüfen, und die Verwendung java.io wenn das der Fall ist.

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

Für den obigen Code, ich diesen Fehler für verschiedene Größen von test.txt von 4 Bytes zu 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)

Kann mir jemand erklären, was ich falsch mache und wie kann ich diese an die Arbeit, während immer noch mit nio lesen?

War es hilfreich?

Lösung

Stephen C gesagt, um den Puffer unmap.

Hier ist jedoch ein Link noch offen (ab 2002) Anfrage für MappedBybeBuffer.unmap Verfahren.

Es hat ein paar Workarounds vorgeschlagen, damit Sie sie versuchen können.

Andere Tipps

Sie müssen explizit unmap der Region, dass Sie mit dem FileChannel.map(...) Anruf zugeordnet ist.

Die Javadoc map(...) sagt diese:

  

A mapping, einmal etabliert, ist nicht abhängig von dem Dateikanal, der verwendet wurde, um es zu schaffen. Schließen des Kanals, insbesondere hat keine Auswirkung auf die Gültigkeit der Zuordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top