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

StackOverflow https://stackoverflow.com/questions/486494

Вопрос

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

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

\\remote-machine\dir\MyFileHere.txt

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

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

Повторно запускаю мой java-файл, читает, нормально.

Повторно запустите мой java-файл внутри "engine" -> FileNotFoundException.

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

Вопрос

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

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

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

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

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

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

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

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

Редактировать

Решаемая.Спасибо вам, Стив У.

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

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

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

Я использовал "Process Explorer" из SysInternals, чтобы точно знать командную строку, используемую для запуска приложения engine.

ЧТО за БАРДАК!

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

File:////remote-machine/dir/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()));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top