ObjectInputStream создает исключение ioexception в разделе блокировки файловой блокировки - PullRequest
0 голосов
/ 01 июля 2018

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

        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 Ответ

0 голосов
/ 01 июля 2018

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

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

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

...