Возникает исключение Java Filenotfound

Для моего кода создается исключение FileNotFound Exception, хотя у меня есть файл именно в том каталоге, который я указал. Я также пробовал ...new File("euler8.txt");... безуспешно. Мой код выглядит следующим образом:

        private static void euler8() throws IOException
{   
    int current;
    int largest=0;
    int c =0;
    ArrayList<Integer> bar = new ArrayList<Integer>(0);
    File infile = new File("C:/Users/xxxxxxxx/workspace/Euler1/euler8.txt");
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(
            new FileInputStream(infile),
            Charset.forName("UTF-8")));
    try
    {
        while((c = reader.read()) != -1) 
        {
            bar.add(c);
        }
    }
    finally{reader.close();}
    for(int i=0; i<bar.size(); i++)
    {
        current = bar.get(i) * bar.get(i+1) * bar.get(i+2) * bar.get(i+3) * bar.get(i+4);
        if(largest<current)
            largest = current;
    }
}

Изображение того, что он делает:

http://img163.imageshack.us/img163/7017/halpbk.png


person Bennett    schedule 19.12.2012    source источник
comment
Пробовали ли вы напечатать абсолютный путь к вашему файлу и, возможно, сравнить этот вывод с абсолютным путем к новому файлу (.), чтобы увидеть, не допустили ли вы каких-либо ошибок в пути? Верен ли регистр в имени файла?   -  person Roger Lindsjö    schedule 20.12.2012
comment
Попробуйте добавить System.out.println(infile.exists()); сразу после объявления infile. Если это вернет false, что-то не так с вашим путем к файлу - продолжайте возвращаться к каталогу, пока не получите true. Если это окажется правдой... ???   -  person Nick Rippe    schedule 20.12.2012
comment
Попробуйте использовать ../Euler1/euler8.txt в качестве пути к файлу.   -  person Smit    schedule 20.12.2012
comment
../Euler1/euler8.txt не получилось. Та же ошибка   -  person Bennett    schedule 22.12.2012


Ответы (4)


За исключением всего остального, что было предложено, вы можете проверить, есть ли у вас эта проблема (которую мы наблюдали в нашей лаборатории): файлы с двойным расширением. Другими словами, убедитесь, что ваш euler8.txt действительно называется так, а не euler8.txt.txt, например, потому что со скрытыми расширениями проводник покажет первое, но поначалу это может не показаться вам странным, если вы не помните, что это должен скрыть расширение.

person Theodoros Chatzigiannakis    schedule 19.12.2012
comment
Судя по картинке, предоставленной @James Roberts, вы правы. В имени файла указано «euler8.txt», но должно было быть указано только «euler8», поскольку в Windows 7 расширение указывается отдельно. - person JavaNewbie_M107; 21.12.2012
comment
@JavaNewbie_M107 Я не заметил картинку. Кажется, это все. Будем надеяться, что ОП вернётся сюда. - person Theodoros Chatzigiannakis; 21.12.2012
comment
Чтобы помочь... На моих компьютерах с Windows для разработки я отключил эту опцию, потому что эта проблема часто возникает из-за простого метода переименования файлов в Windows, но из-за отсутствия видимости расширения. - person Justin Smith; 21.12.2012
comment
@TheodorosChatzigiannakis ПОБЕДИТЕЛЬ - person Bennett; 22.12.2012

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

person dashrb    schedule 19.12.2012

Этот код не будет работать, если все каталоги еще не существуют, поэтому я предполагаю (надеюсь, я прав), что у вас опечатка или отсутствует папка.

Обычно я предпочитаю иметь ссылку java.io.File на родительский каталог, а затем использовать его как родитель в последующей ссылке на файл, т.е.:

File dir = new File("parentDir");
File inFile = new File(dir, "fileName");

Кроме того, java.io.File имеет метод exists(), который возвращает true или false, а его последующие mkdir(), mkdirs() и createNewFile() возвращают true или false, если они действительно создают запрошенный файл.

Тем не менее, я изменил ваш код следующим образом, и он выполняется на моей машине; но я не знаю, какие данные вы пытаетесь запустить через это.

    int current;
    int largest = 0;
    int c = 0;
    ArrayList<Integer> bar = new ArrayList<Integer>(0);
    File dir = new File("C:/Users/myuser/workspace/Euler1");
    if(!dir.exists()){
        dir.mkdirs();
    }
    File infile = new File(dir, "euler8.txt");
    if(!infile.exists()){
        infile.createNewFile();
    }
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(
            new FileInputStream(infile),
            Charset.forName("UTF-8")));
    try {
        while ((c = reader.read()) != -1) {
            bar.add(c);
        }
    } finally {
        reader.close();
    }
    for (int i = 0; i < bar.size(); i++) {
        current = bar.get(i) * bar.get(i + 1) * bar.get(i + 2) * bar.get(i + 3) * bar.get(i + 4);
        if (largest < current) {
            largest = current;
        }
    }
person Justin Smith    schedule 19.12.2012

Обратная косая черта совершенно не нужна. Я запустил эту программу:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test {
  public static void main(String[] args) throws IOException {
    File infile = new File("C:/Users/pats/workspace/test/euler8.txt");
    BufferedReader reader = new BufferedReader(new InputStreamReader(
        new FileInputStream(infile), Charset.forName("UTF-8")));
    try {
      String s;
      while ((s = reader.readLine()) != null) {
        System.out.println(s);
      }
    } finally {
      reader.close();
    }
  }
}

что очень похоже, и он распечатал содержимое моего файла.

Я думаю, вам нужно проверить и то, что файл существует, и то, что у вас есть к нему доступ.

person Patricia Shanahan    schedule 19.12.2012