ObjectInputStream генерирует исключение ioexception в разделе блокировки файловой блокировки

У меня есть функция, которая должна поместить пару ключ-значение в карту, хранящуюся в файле. Если файл не существует, я должен создать его. Я пытаюсь заблокировать файл, когда работаю с ним с помощью блокировки файлов (). Но когда я пытаюсь записать в него (внутри заблокированного раздела), я получаю исключение ввода-вывода: Подавлено: java.io.IOException: процесс не может получить доступ к файлу, потому что другой процесс заблокировал часть файла, который я, вероятно, надену не используйте замок () справа. Вот моя функция:

        private void createDataSet(String key, String data) throws IOException, ClassNotFoundException{

                final   String path = (fileName);
    //            1. Check if file exists
    //            2. If file exists, write/override key/value.
                Path nPath = Paths.get(path);
                HashMap<String, List<String>> map = new HashMap<String, List<String>>();
    //            createFile is atomic, no need to check if exists.
                    try(FileChannel fileChannel = FileChannel.open(nPath,StandardOpenOption.WRITE,StandardOpenOption.APPEND
                            , StandardOpenOption.CREATE);
                        FileOutputStream fos= new FileOutputStream(path, false);
                        ObjectOutputStream oos= new ObjectOutputStream(fos);

                        ){
                        FileLock lock = fileChannel.lock();
                        if(fileChannel.size()==4){
                            map.put(key, values);
                            oos.writeObject(map);
                        }else{
                            ObjectInputStream objectIn = new ObjectInputStream(Channels.newInputStream(fileChannel));
                            Object obj = objectIn.readObject();
                            map = (HashMap<String, List<String>>) obj;
                            map.put(key, values);
// In this row exception being throwed:
                            oos.writeObject(map); 
                        }
                        oos.close();
                        fos.close();
                        lock.release();
                    }
                    return;

1 ответ

Решение

Вы открываете файл дважды - один раз через FileChannelдругой через FileOutputStream, Затем вы блокируете файл через FileChannel но попробуйте написать на него через FileOutputStream, Вот почему поток заблокирован блокировкой канала.

FileChannel имеет свои собственные методы чтения / записи. Используйте либо канал, либо поток, но не оба.

[Редактировать] блокировка файла предназначена для предотвращения записи в него другим процессом, поэтому, если вы не знаете, что существует какой-то другой процесс, который может попытаться записать в ваш файл, обычно нет необходимости явно блокировать файл перед записью в него.

Другие вопросы по тегам