FileNotFoundException при открытии FileOutputStream для чтения того же файла с использованием Java Nio

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

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

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?

Это было полезно?

Решение

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

Однако вот связь для ВСЕ ЕЩЕ ОТКРЫТОГО (с 2002 года) запроса для метода MappedBybeBuffer.unmap.

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top