2014-12-01 4 views
0

Метод возвращает FileNotFoundException:Expression File.Exists() возвращает истину, чтение файла завершается с FileNotFoundException

String statSource = 'some path'; 
try { 

     File file = new File(statSource); 

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


     // otevření CSV 
     csv = new CsvReader(statSource, ';', Charset.forName("windows-1250")); 
    } 

Сначала я получаю 'OK!' сообщение, но на последней строке я получаю FileNotFoundException. Файл находится на локальном жестком диске.

У вас есть представление, что не так?

+0

Инициализация 'CsvReader' происходит независимо от того, существует файл. – Mena

+0

Является ли путь statsource каталогом или файлом? –

+1

'FileNotFoundException' - это самое бесполезное исключение, когда-либо изящное JDK, так как вы также получите его, когда файл существует, но вы не можете его прочитать или записать. Итак, разместите полную трассировку стека: только связанное сообщение может дать подсказку. – fge

ответ

1

Предполагая, что вы говорите о this class, и что вы используете JDK 7, сделайте себе одолжение и использовать это:

final Path csvpath = Paths.get(statSource); 

try (
    final InputStream in = Files.newInputStream(csvpath); 
    final CsvReader csv = new CsvReader(in, ';', Charset.forName("windows-1250"); 
) { 
    // operate on csv 
} 

Если файл не существует, или любой другой, вы, по крайней мере, получить содержательный исключение: AccessDeniedException, NoSuchFileException и т. д .; все они наследуют FileSystemException.

+0

'java.nio.file.NoSuchFileException: C: \ Users \ medm \ Documents \ Rocenka \ Rocenka_2014_test_listopad \ Rocenka_2014_priprava \ data \ 2014 \ 2014-oprava_ST055.csv at sun.nio.fs.WindowsException.translateToIOException (WindowsException.java:79) at sun.nio.fs.WindowsException.rethrowAsIOException (WindowsException.java:97) \t at sun.nio.fs.WindowsException.rethrowAsIOException (WindowsException.java:102) на sun.nio.fs.WindowsFileSystemProvider.newByteChannel (WindowsFileSystemProvider.java : 229) at java.nio.file.Files.newByteChannel (Files.java:315) в java.nio.file.Files.newByteChannel (Files.java:361) ' –

+1

Ну теперь вы знаете, в чем проблема;) – fge

-1

Я думаю, что вы просто передаете имя файла в csvReader. для чтения файлов в java, вы должны использовать FileReader.

Вы можете попробовать изменить последнюю строку на,

csv = new CsvReader(new FileReader(statSource), ';', Charset.forName("windows-1250")); 
0

FileNotFoundException - Если данный объект файл не обозначают существующий, перезаписываемый регулярный файл и новый регулярный файл с таким именем не может быть создано, или если какая-то другая ошибка происходит при открытии или создания файла

Так FileNotFoundException может быть выброшен в следующих 3 ках SES.

  1. Файл не существует.
  2. Файл на самом деле является каталогом.
  3. Указанный файл не может быть открыт для чтения по какой-то причине, скажем, разрешение

Итак, убедитесь, что вы работаете на файл не является каталогом, а затем попробуйте использовать file.canRead() (не достаточно надежен на окнах хотя см. bug), чтобы проверить его на # 3.

+0

Даже «.canRead()», к сожалению, ненадежен. Я видел, как он терпел неудачу в Windows много раз. – fge

+0

@fge, да, но стоит попробовать хотя. Я обновлю его в своем ответе. – Jaskey