【问题标题】:Java Hashmap where the Key is a File and the Value is a ModelJava Hashmap,其中键是文件,值是模型
【发布时间】:2012-07-25 07:26:15
【问题描述】:

我正在处理一个项目,其中我有一个哈希图,其中键作为 Java IO 库中的文件对象和一个自定义模型对象,称为 DrawingModel 作为哈希图中的值。当我更改模型时,我需要保存文件。当我经历以下一系列事件时:

  1. 我打开一个文件
  2. 我做了一些改变
  3. 我保存该文件(文件 -> 保存)
  4. 我退出文件
  5. 然后我打开同一个文件
  6. 但是,它打不开!

我的问题是,如果我更改文件(通过保存),是否需要从 Hashmap 中删除该键值对并添加新的键值对?这样的值是相同的,但键被更新?

非常感谢您的宝贵时间和帮助!

真诚地, nc5

【问题讨论】:

    标签: java hashmap java-io


    【解决方案1】:

    File 对象只不过是实际文件路径的包装器。它不会以任何方式锁定您的文件。

    锁定是由一些仍然打开的流引起的。我敢打赌,您在保存到文件后不会关闭输出流。

    【讨论】:

    • 谢谢!我认为可能是这种情况,但我不是 100% 确定。感谢您的确认。
    【解决方案2】:

    我建议您将文件名作为键而不是文件对象,并通过其他逻辑处理文件编辑/更新内容。 将文件对象作为键没有多大意义

    【讨论】:

    • 这很有意义。虽然我不完全理解(因此宽恕)应用程序设计,但在引用文件时应该始终使用 File 实例。何苦只使用String 并记住它实际上是一个文件引用?
    • 但是像这种情况下关闭/打开流等问题将继续发生,您将不得不使用额外的代码来处理。
    • 恐怕我看不出你的观点与File对象是否用于存储文件的路径,而不是String有什么关系。
    • 我想我没有正确解释 ma ans :) .. 我完全同意应该始终使用文件对象来引用文件。但是在这个问题中,为什么它应该用作指向另一个对象的键。 ???我只是提出了一个改变应用程序设计的建议,以便将地图键设为文件名。
    • 嘿 Akhil,感谢您的建议,事实证明,使用文件的规范路径正是我的 hashmap 所需要的。再次感谢!
    【解决方案3】:

    是的。如果你从逻辑上思考,你的钥匙就变了。而且一旦更改,您将无法再使用它来定位您的数据。您应该在地图中插入一个(新键,值)对。

    【讨论】:

    • 如果引用文件的内容发生变化,File 实例不会发生变化。
    • 是的,具体来说equals()方法也只在File实例引用的路径上计算。
    • hashcode() 怎么样?我其实想看看java.io.Filehashcode() 方法,但是手头没有源代码。 :(
    • 来自 JavaDocs:“在 UNIX 系统上,抽象路径名的哈希码等于其路径名字符串的哈希码和十进制值 1234321 的异或。在 Microsoft Windows 上系统,哈希码等于其路径名字符串转换为小写的哈希码与十进制值 1234321 的异或。路径名字符串小写时不考虑区域设置。"
    【解决方案4】:

    总是close()file打开否则文件将不会被更新。它也将是最好关闭Connection and Channel streams

    【讨论】:

      【解决方案5】:

      确保您已关闭文件流(最上面的一个)。即,如果您一个接一个地打开了多个流,请确保关闭最顶层的流。否则文件将被操作系统锁定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 1970-01-01
        相关资源
        最近更新 更多