FileNotFoundException выдается, когда файл существует - PullRequest
3 голосов
/ 28 января 2009

Я сталкиваюсь с этой странной проблемой.

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

\\remote-machine\dir\MyFileHere.txt

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

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

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

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

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

Вопрос

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

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

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

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

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

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

Не вызовет ли вместо этого исключение SecurityException?

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

EDIT

решаемая. Спасибо, Стив В.

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

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

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

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

ЧТО СООБЩЕНИЕ!

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

Ответы [ 4 ]

5 голосов
/ 28 января 2009

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

0 голосов
/ 28 января 2009

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

Файл: ////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()));
}
0 голосов
/ 28 января 2009

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

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

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

0 голосов
/ 28 января 2009

Дважды проверьте, что файл действительно называется "MyFileHere.txt", а не "MyFileHere.txt.txt" Если вы скрываете расширение файла, это простая ошибка, чтобы пропустить

...