JNotify и File Reader конфликтуют друг с другом - PullRequest
2 голосов
/ 08 июля 2011

Я реализовал JNotify, чтобы определить, когда новый файл прибывает в определенный каталог, и, когда файл прибывает, отправить имя файла в другую функцию, как показано ниже:

    public class FileDetector {
            MessageProcessor mp;
            class Listener implements JNotifyListener {
                    public void fileCreated(int wd, String rootPath, String name) {
                            print("created " + rootPath + " : " + name);
                            mp.processMessage(rootPath + "\\" + name);
                    }
            }
    }

Функция mp.processMessage пытается открыть файл, но я получаю сообщение об ошибке, что файл используется другим процессом.Однако, поскольку файл был только что создан, единственным другим процессом, который может использовать его, является JNotify.

Я поместил пару операторов print, и оказалось, что функция mp.processMessage вызывается перед функцией печати слушателя.У кого-нибудь есть предложение, как мне решить эту проблему, помимо размещения всей обработки сообщений внутри класса слушателя?

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

@ Eile Я думаю, что как только один процесс копирует файл, вы пытаетесь его прочитать, задержка в 100 мс завершит копирование сначала n, а затем вы сможете легко прочитать файл.

0 голосов
/ 22 августа 2011

Я попробовал это и обнаружил, что произвольная задержка не сработала для меня. Что я сделал, так это создал DelayQueue. Я добавил каждый наблюдаемый новый файл в очередь с задержкой в ​​100 мс. Когда задержка истекла, я проверил, доступен ли файл для чтения / записи. Если это было, я вытолкнул его из очереди. Если нет, я зачитал его в очередь с задержкой в ​​100 мс. Чтобы проверить, было ли это доступно для чтения / записи, я пытаюсь открыть FileInputStream для файла. Если не исключение, я закрываю поток и выскакиваю файл.

Я надеюсь, что у nio.2 (jsr 203) нет такой же проблемы. Если вы можете использовать Java 7, вы можете попробовать.

0 голосов
/ 11 июля 2011

Вот что я сделал до сих пор - я добавил в mp.processMessage() задержку в 100 миллисекунд, прежде чем пытаться открыть файл, и у меня не было проблем с ним. Тем не менее, я все еще озадачен, почему это было бы необходимо, и есть ли лучшее решение этой проблемы.

...