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 файл за ръчно стартиране на двигателя. Тъй като ще се стартира ръчно, потребителят има достъп до мрежата.

Използвах "Process Explorer" от SysInternals, за да знам точно командния ред, използван за стартиране на приложението на двигателя.

КАКВА БЪРКОТИЯ!

Благодаря на тези, които публикуваха отговори.


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


Отговори (4)


Споделеният ресурс защитен ли е с потребителско име и парола? И ако е така, двигателят на вашето приложение работи ли като този потребител? Ако машината на вашето приложение работи като услуга на Windows, услугата на Windows не може да работи като „Акаунт на локалната система“. Този акаунт няма достъп до мрежата. Трябва да конфигурирате услугата си да работи като потребител, който има права за достъп до споделения диск.

person Steve Wranovsky    schedule 28.01.2009
comment
1stq: Така е. 2ndq: Не е. 3-то не е услуга, но гледайки внимателно, стартовият панел работи като локален потребител, но този стартер (добре) стартира приложението на двигателя, чийто потребител е SYSTEM (следователно не е позволено да използва мрежа) :-/ Трябва ли да видя как този стартер може ли да стартира приложението не като 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 адреси на отдалечени файлове. Опитайте следното и вижте дали работи:

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()));
}
person Igor Zelaya    schedule 28.01.2009
comment
Благодаря ти Игор. Това не е така, защото един и същ път е използван вътре и извън двигателя. Проблемът беше, че виртуалната машина е създадена като потребител SYSTEM, който няма достъп до мрежови ресурси. Благодаря все пак за отговора. - person OscarRyz; 28.01.2009