FileNotFoundException возникает, когда файл существует

Я столкнулся с этой странной проблемой.

Я пытаюсь прочитать файл, который находится на другом компьютере, как общий ресурс:

\\remote-machine\dir\MyFileHere.txt

Когда я запускаю отдельное приложение (16-строчный java-файл), все в порядке. Но когда я пытаюсь прочитать тот же файл с использованием того же класса и того же метода из серверного «движка» (это механизм приложения, очень похожий на сервер приложений Java EE, где вы можете запускать java-программы), «FileNotFoundException» бросается.

Я думал, что будут какие-то разрешения, поэтому я сопоставляю ресурс как диск: K:\

Перезапустите мой java-файл, читает, хорошо.

Перезапустите мой java-файл внутри «движка» -> FileNotFoundException.

Когда я копирую файл на локальный компьютер ( C:\MyFileHere.txt ), никаких исключений не возникает.

Вопрос

Что может быть причиной этого FileNotFoundException?

Я использую Java 1.5

Насколько я знаю, движок в значительной степени прозрачно использует java.

Кто-нибудь сталкивался с чем-то подобным?

Дополнительный вопрос? Что было бы хорошим подходом для обхода этого? Я начинаю думать об установке Tomcat, обслуживающей эти файлы и читающей их через http, но я думаю, что это слишком, поэтому протокол SMB стоит на первом месте, не так ли? И, вероятно, я все равно не смогу открывать сокеты.

Может ли быть причиной диспетчер безопасности (я никогда не использовал его раньше, но я знаю, что он существует)

Разве вместо этого не будет выброшено исключение SecurityException, если это будет так?

Большое спасибо.

ИЗМЕНИТЬ

Решено. Спасибо, Стив В.

Оказывается, этот движок запускается с помощью «LaunchAnywhere» от ZeroG. Итак, создается .exe, который, в свою очередь, запускает JVM с указанным приложением.

Это приложение само по себе является Launcher. Когда он запускает двигатель, каким-то образом (я не могу понять, почему и как) пользователь, которому принадлежит процесс JVM, является SYSTEM. КАК указал Стив, у этого пользователя нет доступа к СЕТИ, и поэтому он не может читать из общего ресурса или подключенного диска.

Обходной путь (пока я сообщаю об этом производителю) заключается в создании файла .cmd для запуска движка вручную. Поскольку он будет запускаться вручную, пользователь имеет доступ к сети.

Я использовал «Проводник процессов» от SysInternals, чтобы точно знать командную строку, используемую для запуска приложения движка.

КАКАЯ МАССА!

Спасибо тем, кто разместил ответы.


person OscarRyz    schedule 28.01.2009    source источник


Ответы (4)


Защищен ли общий ресурс именем пользователя и паролем? И если да, работает ли ваш движок приложения от имени этого пользователя? Если ядро ​​вашего приложения работает как служба Windows, служба Windows не может работать как «Учетная запись локальной системы». Эта учетная запись не может получить доступ к сети. Вы должны настроить службу для запуска от имени пользователя, имеющего права доступа к общему диску.

person Steve Wranovsky    schedule 28.01.2009
comment
1stq: Это так. 2ndq: Нет. 3-й. Это не служба, но при внимательном рассмотрении программа запуска работает как локальный пользователь, но эта программа запуска (хорошо) запускает приложение движка, пользователем которого является СИСТЕМА (следовательно, не разрешено использовать сеть) :-/ Могу ли я увидеть, как эта программа запуска может запустить приложение не как SYSTEM? - person OscarRyz; 28.01.2009
comment
Я смотрю на движок, который был запущен с помощью LaunchAnywhere (из zerog). Я не знаю, как он запускает новую виртуальную машину с помощью SYSTEM: -/ - person OscarRyz; 28.01.2009
comment
Этот ответ дал подсказку для решения проблемы. Большое спасибо. - person OscarRyz; 28.01.2009

Дважды проверьте, что файл ДЕЙСТВИТЕЛЬНО называется «MyFileHere.txt», а не «MyFileHere.txt.txt». Если вы скрываете расширение файла, эту ошибку легко пропустить.

person Andrew Harry    schedule 28.01.2009
comment
Но опять же, я действительно не прочитал весь ваш вопрос. Я просто помню, что возникла упомянутая выше проблема, и я чесал голову, решая проблему для кого-то. - person Andrew Harry; 28.01.2009
comment
Двойная и гипертройная проверка. Также пробелы и т. д. Я даже жестко закодировал путь в java-файле, и он работает нормально с java TestRead. Но когда класс TestRead загружается в движок, он выдает FNFE. - person OscarRyz; 28.01.2009

Вы проверили журналы событий на сервере, чтобы убедиться, что он отклонен? возможно, программа работает под другой учетной записью пользователя, чем вы думаете.

Я не знаком с Java, но знаю, что в некоторых программах, которые я написал, мне приходилось разрешать сетевой службе доступ к ресурсам.

На самом деле я вижу, что вы отметили ответ как правильный. о, и это было то же самое, что и мой ответ :) Круто!

person Andrew Harry    schedule 28.01.2009
comment
jejej Да .. большое спасибо. На самом деле ваши выводы были довольно близки. Я не очень хорошо разбираюсь в службах Windows, и это меня удивило. Но я, наконец, получил хороший намек на предложение Стива. уфф. Спасибо, в любом случае. - person OscarRyz; 28.01.2009

Однажды у меня была похожая проблема. Я думаю, это связано с тем, как java разрешает URI удаленных файлов. Попробуйте следующее и посмотрите, работает ли это:

Файл:////удаленная машина/каталог/MyFileHere.txt

Я использовал следующий пример, чтобы проверить наличие файла в общих папках в моем ящике и работал:

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = File:////remote-machine/dir/MyFileHere.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}
person Igor Zelaya    schedule 28.01.2009
comment
Спасибо Игорь. Это не так, потому что один и тот же путь использовался внутри и снаружи двигателя. Проблема заключалась в том, что виртуальная машина была создана с использованием пользователя SYSTEM, у которого нет доступа к сетевым ресурсам. Тем не менее, спасибо за ответ. - person OscarRyz; 28.01.2009