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

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

Вопрос

На этот вопрос уже есть ответ здесь:

Я пытаюсь прочитать файл и получаю ошибку:

java.io.FileNotFoundException: /homes/at1106/fourthYearComputing/Individual-Project/svn-workspace/trunk/Individual_Project/src/game/player/gametheoryagent/configurations/gameTheoryAgentConfiguration.properties  (No such file or directory)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at game.player.gametheoryagent.GameTheoryAgent.<init>(GameTheoryAgent.java:67)
        at simulation.Simulator.createPlayer(Simulator.java:141)
        at simulation.Simulator.main(Simulator.java:64)

однако файл существует, и просто для двойной проверки я дал ему права 777, как показано ниже:

tui% cd /homes/at1106/fourthYearComputing/Individual-Project/svn-workspace/trunk/Individual_Project/src/game/player/gametheoryagent/configurations
tui% ls -al
total 4
drwxrwxrwx 3 at1106 cs4 1024 2010-02-22 17:45 .
drwxrwxrwx 4 at1106 cs4 1024 2010-02-22 17:27 ..
-rwxrwxrwx 1 at1106 cs4  260 2010-02-22 17:31 gameTheoryAgentConfiguration.properties
drwxrwxrwx 6 at1106 cs4 1024 2010-02-22 17:41 .svn

Есть идеи, почему я получаю исключение FNF?

Спасибо

Java-код, который выполняет вызов:

File file = new File(pathToConfiguration)
   Properties configuration = new Properties();
    try{
        configuration.load(new FileInputStream(file));
        int RAISE_RATIO = Integer.parseInt(configuration.getProperty("raise_ratio"));
    }
    catch(IOException event){
        System.err.println("Error in reading configuration file " + pathToConfiguration);
        event.printStackTrace();    
  }

Файл свойств гласит:

raise_ratio=4

Это было протестировано в Windows (с diff pathToConfiguration (который передается в конструктор)) и работает нормально.

Добавлены следующие проверки в блоке Catch

        if(file.exists()){
            System.out.println("file exists");
        }
        else{
            System.out.println("file doesn't exist");
        }

        System.out.println(file.getAbsolutePath());
        if(file.canRead()){
            System.out.println("can read");
        }
        if(file.canWrite()){
            System.out.println("can write");
        }

вывод следующий:

file doesn't exist
/homes/at1106/fourthYearComputing/Individual-Project/svn-workspace/trunk/Individual_Project/src/game/player/gametheoryagent/configurations/gameTheoryAgentConfiguration.properties
Это было полезно?

Решение

Согласно исходной трассировке стека, между именем файла и причиной есть два пробела:

FileNotFoundException: ...Configuration.properties  (No such file or directory)
--------------------------------------------------^^

Это укажет мне на то, что имя файла, возможно, имеет завершающий пробел.Можете ли вы дважды проверить переменную pathToConfiguration:

System.out.println("[" + pathToConfiguration + "]");

Чтобы дважды проверить, что путь — это то, что вы думаете?

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

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

Может быть, существуют какие-то непонятные монтирования NFS/файлового сервера, которые действительны только для оболочки входа в систему, но не для приложений?

Попробуйте скопировать файл в $HOME и посмотрите, работает ли он.

Что будет выведено, если вы напишете это:

System.out.println(new File(".").getAbsolutePath());

какой у тебя текущий каталог?

Когда вы выполняете свою Java-программу, вы запускаете ее от имени того же «пользователя», что и при проверке командной строки?

РЕДАКТИРОВАТЬ:Попробуйте скопировать файл в каталог, из которого вы запускаете свою программу, и посмотрите, сможет ли она его прочитать.Вы также можете попробовать следующее после копирования файла в каталог выполнения:

InputStream in = getClass().getResourceAsStream("/gameTheoryAgentConfiguration.properties");
configuration.load(in);

(при условии, что в вашем пути к классам есть ".")

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top