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

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

через вайл? File.canRead(), например? А в цикле, или как ещё, это уже ваши бизнес требования надо смотреть. Но вообще, проблема часто вылазит, если вы где-то файлы не закрываете. Особенно при записи.
...
Рейтинг: 0 / 0
08.07.2017, 10:52
    #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
08.07.2017, 11:18
    #39485026
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
Музаффар,

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

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

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


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

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

так так так изначально хотел задавать именно этот вопрос как вообще происходит копирования файла вот и ответ, и получается я должен реагировать не на ENTRY_CREATE а на ENTRY_MODIFY?
...
Рейтинг: 0 / 0
08.07.2017, 18:00
    #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
08.07.2017, 18:03
    #39485153
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
МузаффарmaytonСкорее всего два процесса (потока) крутят вотчеры и гоняют гонки за f.canRead()... e.t.c


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


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

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

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


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

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


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

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

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

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

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

винда, йа йа... ))
но не всегда есть эксепшен...
...
Рейтинг: 0 / 0
08.07.2017, 21:49
    #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
08.07.2017, 22:01
    #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
08.07.2017, 22:23
    #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
09.07.2017, 00:19
    #39485224
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
Музаффарвозможно и я не до конца понимаю...
хз, но когда ридингФайл не смог получить доступ Вотчер сразу давал ислкючения и завершал процесс полностью
нет не поток
можно сказать да, хотя об этом не думал даже...
Мне остается только вздыхать и сочувственно кивать. У меня-же нет никаких
сведений по readingFile(...).
...
Рейтинг: 0 / 0
09.07.2017, 05:23
    #39485236
Музаффар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
...
Рейтинг: 0 / 0
09.07.2017, 11:42
    #39485271
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
Хм... я скопировал 1 единственный html файл и ошибка сразу воспроизвелась.
...
Рейтинг: 0 / 0
09.07.2017, 12:50
    #39485294
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к файлу
Я провел еще один эксперимент в большим файлом (1.4Г) и убедился что событие ENTRY_CREATE
прилетает до завершения финализации копирования. Это немножко не то событие. Нам по хорошему
нужно реагировать на закрытие (CLOSE) файла после копирования. Я ищу в спеках WatchService
но ничего не нахожу.

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


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