2017-01-13 17 views
0

Ошибка при попытке открыть FileInputStream для загрузки карты из файла с расширением .ser.java.io.FileNotFoundException при создании FileInputStream

Конструктор где я создаю новый файл и вызвать метод, который загружает карту из файла:

protected DriveatorImpl() { 
    accounts = new ConcurrentHashMap<String, Client>(); 
    db = new File("database.ser"); // oddly this does not create a file if one does not exist 
    loadDB(); 
} 

@SuppressWarnings("unchecked") 
private void loadDB() { 
    try { 
     fileIn = new FileInputStream(db); 
     in = new ObjectInputStream(fileIn); 
     accounts = (Map<String, Client>) in.readObject(); 
     in.close(); 
     fileIn.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Я пытался создать файл вручную и поместить его в одном пакете с классом, но это не помогает , Что происходит?!

Спасибо!

+0

* // Как ни странно, это не создает файл, если он не существует * - не совсем, почему вы думаете, что это нужно? –

+0

О, мне не хватает db.createNewFile(); – GarRudo

+0

Какой смысл? Если файл не существует, вы скорее знаете это, чем получить другое исключение, потому что оно пустое. – EJP

ответ

0

Предоставляет относительный путь для файла. Это означает, что программа будет искать файл относительно рабочего каталога.

В зависимости от того, как вы запускаете программу, это будет каталог, из которого вы его запускаете (если выполняется из Shell/Cmd) или что-то, что настроено в настройках проекта (если выполняется из среды IDE). Для последнего это зависит от IDE, но обычно это корневой каталог проекта.

Более подробная информация о рабочем каталоге: https://en.wikipedia.org/wiki/Working_directory
Более подробной информации по относительному пути: https://en.wikipedia.org/wiki/Path_(computing)#Absolute_and_relative_paths

Что касается создания файла, он будет создавать несуществующий файл, если вы напишете на него. Когда вы читаете его, он ожидает, что он будет существовать. Это означает, что вам нужно создать пустой файл (если он не существует) перед чтением или просто обработать исключение как пустой контент.

+0

Все еще не могу понять, как его настроить. Мой рабочий каталог - это Bank-Services.Путь к классу, где мне нужен ресурс, - это Bank-Services \ src \ ie \ gmit \ sw \ server \ database – GarRudo

+0

Нет абсолютно никакого смысла в создании пустого файла. – EJP

+0

@GarRudo Я думаю, вы можете захотеть, чтобы Google «прочитал ресурсы Java». Ресурсы (в отличие от исходных файлов) поставляются в JAR. Обратите внимание, что ресурсы не меняются после комплектации. – Pijusn

0
  • Путь к файлу дал бы неправильно для IDE может занять relative path, но из командной строки, она примет absolute path.
+0

И если файл не существует, он создаст пустую, что приведет к другой проблеме при маскировке реальной проблемы. – EJP

+0

в соответствии с ответом, который я предложил, я ясно сказал, что если вы хотите создать пустой файл, чем получение исключенного файла, не найденного. Поэтому, если вы не хотите to.go таким образом просто игнорировать и сказал другое решение. Я сомневаюсь, что это вызовет новую проблему, создав пустой файл? –

+0

Другими словами, вы никогда не пробовали. 'new ObjectInputStream (...)' будет генерировать 'EOFException', если он создан с пустым потоком. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^