FileNotFoundException при открытии FileOutputStream для того же файла, прочитанного с использованием Java Java - PullRequest
2 голосов
/ 27 января 2010

У меня есть текстовый редактор, который использует код, почти идентичный приведенному ниже, для чтения и записи. Когда я открываю небольшие файлы для редактирования, я всегда получаю эту ошибку, когда пытаюсь сохранить их снова. Тем не менее, действительно интересно то, что мой текстовый редактор отлично работает с файлами размером около 600 байт или более (кажется, каждый раз меняется), поведение, которое я не смог воспроизвести здесь.

Мой текущий обходной путь - проверить размер файла <1024 байта и использовать java.io, если это так. </p>

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

Для приведенного выше кода я получаю эту ошибку для различных размеров test.txt от 4 байтов до 10 КБ:

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)

Может кто-нибудь объяснить, что я делаю неправильно и как мне заставить это работать, все еще читая с nio?

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Стивен С велел вам отключить отображение буфера.

Однако здесь есть ссылка на STILL OPEN (с 2002 года) для метода MappedBybeBuffer.unmap.

Он предлагает несколько обходных путей, так что вы можете попробовать их.

0 голосов
/ 27 января 2010

Вам необходимо явным образом отменить отображение региона, который вы отобразили с помощью вызова FileChannel.map(...).

Javadoc для map(...) говорит это:

Отображение, однажды созданное, не зависит от файлового канала, который использовался для его создания. В частности, закрытие канала не влияет на достоверность сопоставления.

...