FileNotFoundException при открытии FileOutputStream для чтения того же файла с использованием Java Nio
Вопрос
У меня есть текстовый редактор, в котором для чтения и записи используется код, почти идентичный приведенному ниже.Когда я открываю небольшие файлы для редактирования, я всегда получаю эту ошибку при попытке сохранить их снова.Однако самое интересное то, что мой текстовый редактор отлично работает с файлами размером около 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?
Другие советы
Вам необходимо явно отменить сопоставление региона, который вы сопоставили с помощью FileChannel.map(...)
вызов.
Javadoc для map(...)
говорит это:
Установленное сопоставление не зависит от файлового канала, который использовался для его создания.В частности, закрытие канала не влияет на достоверность отображения.