powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / доступ к файлу
25 сообщений из 90, страница 1 из 4
доступ к файлу
    #39485012
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте уважаемые!
тут столкнулся с проблемой при чтении из файла выбрасывает эксепшен:
Код: plaintext
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

как можно узнать доступность файла?
или надо через вайл проверять в цикле?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485014
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

через вайл? File.canRead(), например? А в цикле, или как ещё, это уже ваши бизнес требования надо смотреть. Но вообще, проблема часто вылазит, если вы где-то файлы не закрываете. Особенно при записи.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485018
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Код: java
1.
2.
3.
4.
while (f.canRead() && f.canWrite() && f.exists()){
                        readingFile(eventDir + "\\" + eventPath);
                        break;
                    }



прослушивается каталог, и с поступлением нового файла читается, парсится и т.д.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
try (WatchService service = FileSystems.getDefault().newWatchService()) {
            Map<WatchKey, Path> keyMap = new HashMap<>();
            Path path = Paths.get(p);

            keyMap.put(path.register(service,
                    StandardWatchEventKinds.ENTRY_CREATE
            //                    ,StandardWatchEventKinds.ENTRY_DELETE
            //                    ,StandardWatchEventKinds.ENTRY_MODIFY
            ), path);

            WatchKey watchKey;

            do {
                watchKey = service.take();
                Path eventDir = keyMap.get(watchKey);

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    Path eventPath = (Path) event.context();
                    System.out.println(eventDir + " : " + kind + " : " + eventPath);
                    File f = new File(eventDir + "\\" + eventPath);

                    while (f.canRead() && f.canWrite() && f.exists()){
                        readingFile(eventDir + "\\" + eventPath);
                        break;
                    }
                }
            } while (watchKey.reset());
        } catch (Exception e) {
            System.out.println("exception on WatchService " + e);
        }



прикол в том что иногда я получаю эксепшн иногда все гладко идет...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485026
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Заведи ScheduledExecutorService и в случае исключения кидай туда задачу обработки файла. У задачи заведи счетчик, чтобы после N попыток её отменить.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485035
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

разве f.canRead() && f.canWrite() && f.exists() не обеспечивает условие?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485043
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как я понял тут говорится что canWrite() и т.д. не помогут? https://stackoverflow.com/questions/1500174/check-if-a-file-is-locked-in-java
...
Рейтинг: 0 / 0
доступ к файлу
    #39485058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c

Надо внимательно смотреть в ps -aux или tasklist на предмет процессов которые должны были
умереть но не умерли. Такое я иногда наблюдал при mvn test или если несколько сеансов
тестирования были запущены из среды.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485061
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c


как два? можно по подробнее
...
Рейтинг: 0 / 0
доступ к файлу
    #39485065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарпрослушивается каталог, и с поступлением нового файла читается, парсится и т.д.
Это неправильно, поскольку файл сначала появляется, потом в него записывается содержимое, потом он закрывается. Читать и парсить его можно только после последней операции, а уведомление ты получаешь о первой.

Если есть возможность изменить логику софтины, которая файл записывает, то следует использовать такую: файл открывается с временным расширением, записывается, закрывается, переименовывается. Тогда по поступлению события переименования ты можешь его спокойно открывать, читать, парсить.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485069
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

так так так изначально хотел задавать именно этот вопрос как вообще происходит копирования файла вот и ответ, и получается я должен реагировать не на ENTRY_CREATE а на ENTRY_MODIFY?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485151
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а такая решения задачи допускается? с точки зрения правильного кодинга?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
do {
                watchKey = service.take();
                Path eventDir = keyMap.get(watchKey);

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    Path eventPath = (Path) event.context();
                    System.out.println(eventDir + " : " + kind + " : " + eventPath);
                    File f = new File(eventDir + "\\" + eventPath);

                    boolean b;
                    do {
                        b = true;
                        try (FileInputStream fis = new FileInputStream(f)) {
                            while (f.canRead() && f.canWrite() && f.exists()) {
                                readingFile(eventDir + "\\" + eventPath);
                                break;
                            }
                        } catch (IOException ex) {
                            System.out.println("Файл занят " + ex);
                            b = false;
                        }
                    } while (!b);
...
Рейтинг: 0 / 0
доступ к файлу
    #39485153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МузаффарmaytonСкорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c


как два? можно по подробнее
Когда возникнет проблема - сделай в консоли
Код: java
1.
$ jps -l 


и покажи что вышло.

Потом я разовью мысль.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485175
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как делаю я:

При получении оповещения о появлении нового файла пытаюсь его открыть в монопольном режиме. Если не получается, в цикле жду некоторый интервал и снова пытаюсь открыть. Если суммарное время интервалов превышает некий максимум, считаю, что с файлом поработать не случилось.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Я думаю еще стоит нам всем обратить внимание на FileLock::lock()
...
Рейтинг: 0 / 0
доступ к файлу
    #39485202
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: java
1.
$ jps -l 


и покажи что вышло.

Потом я разовью мысль.
сорри но как это делается?


да скорее проблема в локе походу...

а чем мой вариант плох?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485204
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[рукалицо]

Открой консоль (что у тебя Windows или RHEL) и набери текст который я тебе набил. В ответ тебе
выскочит список java процессов запущенных в данный момент. Я подозреваю что ты не прибил старый
процесс и сам себя заблочил....

Фууууххх....

Ферштейн?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485205
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

винда, йа йа... ))
но не всегда есть эксепшен...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485206
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что получил при добавлении нового файла...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
c:\testFolder\in : ENTRY_CREATE : 95.txt
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Файл занят java.io.FileNotFoundException: c:\testFolder\in\95.txt (Процесс не может получить доступ к файлу, так как этот файл занят другим процессом)
Using file name c:\testFolder\in\95.txt
Размер файла: 302 байт(а)
can not reading SPR93 TrainTables.HtmlTable@3d4eac69
Размер файла: 302 байт(а)
can reading SPR95 TrainTables.HtmlTable@42a57993
<html>
<body>
ВЦ УТИ 95 04.07 09-29 ВЦ 73 ПОДХОД ПОЕЗДОВ К СТАНЦИИ ЧУКУР 
<table>
<tr><th>НОМЕР</th><th>ИНДЕКС</th><th>СОСТ</th><th>СТАН</th><th>ДАТА</th><th>ВРЕМЯ</th></tr>
<tr><td>0370</td><td>0000  04 0370</td><td>ОТПР</td><td>КЕЛЕС</td><td>04.07</td><td>04-45</td></tr>
<tr><td>4401</td><td>7236  01 7235</td><td>ОТПР</td><td>КЗТУК</td><td>04.07</td><td>06-40</td></tr>
<tr><td>3605</td><td>7261  88 0060</td><td>ОТПР</td><td>УЗБЕК</td><td>04.07</td><td>06-44</td></tr>
<tr><td>3620</td><td>7200  76 7222</td><td>ОТПР</td><td>КЕЛЕС</td><td>04.07</td><td>06-53</td></tr>
</table>
</body>
</html>
...
Рейтинг: 0 / 0
доступ к файлу
    #39485211
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сведеньям jps вроде все ОК. У тебя 1 процесс TrainTables.main. Это хорошо.

Значит причины блокировки либо в 3-м приложении (антивирус?) либо ты так написал код
что блокируешь сам себя.

Теперь вопросы:
1) Откуда ты взял этот код? Сам написал?

Код: java
1.
2.
3.
4.
 while (f.canRead() && f.canWrite() && f.exists()) {
                                readingFile(eventDir + "\\" + eventPath);
                                break;
                            }


Здесь между проверкой на canRead(), canWrite() есть ненулевой тик времени когда файл теоретически
может быть захвачен другим потоком (процессом). Нарушается базовый принцип работы с блокировками.
Ты не можешь пробовать или щупать статус блокировки. Ты должен блокировать сразу.

2) Я до конца не помню как работает WatchService. Но может-ли он ловить своё собственное эхо?
Тоесть поймать положительную обратную связь от процесса readingFile? И что внутри raeadingFile?
Поток? Асинхронный вызов?
...
Рейтинг: 0 / 0
доступ к файлу
    #39485214
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

может быть проблема в антивире...

счас узнаем, и так выключил автоматическую защиту антивира, 3 раза зациклился... значит антивир не причем.

авторлибо ты так написал код что блокируешь сам себя.
ну вотчер был взять кдето из доках оракла...


автор Откуда ты взял этот код? Сам написал?
сам, думал поможет так как в доке написан для чтения (Tests whether the application can read the file denoted by this abstract pathname.) а для записи (Tests whether the application can modify the file denoted by this abstract pathname.) как я понял тут может ли читать, может ли записать...

авторЗдесь между проверкой на canRead(), canWrite() есть ненулевой тик времени когда файл теоретически
может быть захвачен другим потоком (процессом). Нарушается базовый принцип работы с блокировками.
Ты не можешь пробовать или щупать статус блокировки. Ты должен блокировать сразу.
может быть а может на самом деле файл сначала появляется, потом в него записывается содержимое, потом он закрывается и вотчер при появлении собирается читать когда ОС ещё записывает туда инфо?

автор2) Я до конца не помню как работает WatchService. Но может-ли он ловить своё собственное эхо?
Тоесть поймать положительную обратную связь от процесса readingFile? И что внутри raeadingFile?
Поток? Асинхронный вызов?
возможно и я не до конца понимаю...
хз, но когда ридингФайл не смог получить доступ Вотчер сразу давал ислкючения и завершал процесс полностью
нет не поток
можно сказать да, хотя об этом не думал даже...
...
Рейтинг: 0 / 0
доступ к файлу
    #39485224
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарвозможно и я не до конца понимаю...
хз, но когда ридингФайл не смог получить доступ Вотчер сразу давал ислкючения и завершал процесс полностью
нет не поток
можно сказать да, хотя об этом не думал даже...
Мне остается только вздыхать и сочувственно кивать. У меня-же нет никаких
сведений по readingFile(...).
...
Рейтинг: 0 / 0
доступ к файлу
    #39485236
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
доступ к файлу
    #39485271
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... я скопировал 1 единственный html файл и ошибка сразу воспроизвелась.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485294
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я провел еще один эксперимент в большим файлом (1.4Г) и убедился что событие ENTRY_CREATE
прилетает до завершения финализации копирования. Это немножко не то событие. Нам по хорошему
нужно реагировать на закрытие (CLOSE) файла после копирования. Я ищу в спеках WatchService
но ничего не нахожу.

Бесконечный цикл с проверкой canRead(), canWrite() является по моему мнению нехорошим
паттерном. Мне не верится что имемнно такой подход используется в веб-контейнерах
к примеру для мониторинга изменений *.jsp. Скорее всего там нечто более умное. Вот
это умное нам надо найти.
...
Рейтинг: 0 / 0
доступ к файлу
    #39485298
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 90, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / доступ к файлу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]