Недавно я нашел интересный случай, который создает FileNotFoundExeption, когда файл, очевидно, существует на диске. В моей программе я читаю путь к файлу из другого текстового файла и создаю объект File:
//String path was read from file
System.out.println(path); //file with exactly same visible path exists on disk
File file = new File(path);
System.out.println(file.exists()); //false
System.out.println(file.canRead()); //false
FileInputStream fis = new FileInputStream(file); // FileNotFoundExeption
Причиной истории является то, что в конце пути содержатся невидимые символы\r\n. Исправление:
File file = new File(path.trim());