【问题标题】:java.io.FileNotFoundException when creating FileInputStream创建 FileInputStream 时出现 java.io.FileNotFoundException
【发布时间】:2017-01-13 06:17:52
【问题描述】:

尝试打开 FileInputStream 以从扩展名为 .ser 的文件加载 Map 时出错。

我创建新文件并调用从文件加载地图的方法的构造函数:

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();
    }
}

我尝试手动创建文件并将其与类放在同一个包中,但它没有帮助。怎么回事?!

谢谢!

【问题讨论】:

  • // 奇怪的是,如果一个文件不存在,它不会创建一个文件 - 不是真的,你为什么认为它应该?
  • 哦,我错过了 db.createNewFile();
  • 这样做有什么意义?如果文件不存在,您宁愿知道这一点,也不愿因为它是空的而得到不同的异常。
  • 在真实的开发场景中,你在说什么是有道理的。这是一个大学项目,我正在创建空文件,以防程序在其他机器上重新运行。感谢您的提示。
  • 不回答问题。如果文件不存在,您宁愿知道这一点,而不是因为文件为空而遇到不同的问题。如果您需要创建它包含一些内容,请执行此操作。 File.createNewFile() 不是万能的创可贴。

标签: java io filenotfoundexception fileinputstream


【解决方案1】:

您提供文件的相对路径。这意味着程序将查找相​​对于工作目录的文件。

根据您运行程序的方式,它将是您运行它的目录(如果从 Shell/Cmd 运行)或项目设置中配置的任何内容(如果从 IDE 运行)。对于后者,它取决于 IDE,但通常是项目根目录。

有关工作目录的更多信息:https://en.wikipedia.org/wiki/Working_directory
有关相对路径的更多信息:https://en.wikipedia.org/wiki/Path_(computing)#Absolute_and_relative_paths

关于文件的创建,如果您要写入文件,它将创建不存在的文件。当您阅读它时,它期望它存在。这意味着您必须在读取之前创建空文件(如果不存在)或简单地将异常视为空内容

【讨论】:

  • 还是不知道怎么配置。我的工作目录是 Bank-Services。我需要资源的类的路径是 Bank-Services\src\ie\gmit\sw\server\database
  • @GarRudo 我想你可能想谷歌“阅读 Java 资源”。资源(与源文件不同)捆绑到 JAR 中。请注意,资源一旦捆绑就不会改变。
  • @Pijusn 我需要它,并且我计划为服务器端制作一个 JAR 以在其他机器上运行。我认为资源将是应用程序所需的任何外围文档或硬件来完成它的用途。我错了吗?
  • @GarRudo 不确定您所说的 硬件 是什么意思,但资源只是与 JAR 捆绑在一起的文件(任何类型)。常见用例:模板、数据、配置、图像。本质上,如果它是一个文件 - 您可以将其作为资源。您的应用程序可能不仅仅依赖于资源(而且通常如此)。例如硬件、外部配置文件、数据库……然而,这些只能存在于你的 JAR 之外,并在运行时被检查/访问。
  • 我绝对希望将这个 database.sir 保留在 JAR 外部,因为我想修改它。它在这个项目中“充当”数据库。如果我想在不同的机器上运行它,我必须随身携带服务器的 JAR。
【解决方案2】:
  • 对于 IDE,您提供的文件路径可能有误,它可以采用 relative path,但在命令行中,它将采用 absolute path

【讨论】:

  • 如果文件不存在,它会创建一个空文件,这只会导致另一个问题,同时掩盖真正的问题。
  • 根据我建议的答案,我明确表示,如果您想创建空文件而不是获取文件未找到异常。因此,如果您不想这样做,请忽略并说其他解决方案。我怀疑创建空文件会如何导致新问题?
  • 换句话说,您从未尝试过。如果使用空流构造new ObjectInputStream(...),将抛出EOFException
  • 我同意这一点。看起来只有相对和绝对路径问题。我会更新我的解决方案
  • 顺便说一句,这正是我在修复文件路径后现在收到的错误。 :) java.io.EOFException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2014-12-28
相关资源
最近更新 更多