【问题标题】:The filename, directory name, or volume label syntax is incorrect - how to specify file path in properties file文件名、目录名或卷标语法不正确 - 如何在属性文件中指定文件路径
【发布时间】:2017-09-18 19:11:30
【问题描述】:

我正在读取属性文件以获取如下文件路径。

    String result = "";
    InputStream inputStream = null;
    try {
        Properties prop = new Properties();
        String propFileName = "config.properties";

        inputStream = GetPropertyValues.class.getClassLoader().getResourceAsStream(propFileName);

        if (inputStream != null) {
            prop.load(inputStream);
        } else {
            throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath");
        }

属性文件的路径如下所示。

configSettingsFilePath = C:\\\\ConfigSetting.xml

现在,当我运行我的代码说找不到文件时,我得到了以下异常。

Creating instance of bean 'configSettingHelper'

configSettingsFilePath = C:\ConfigSetting.xml 2017-09-18 14:47:00 调试 ConfigSettingHelper:42 - ConfigSettingHelper :: ConfigSetting File:configSettingsFilePath = C:\ConfigSetting.xml javax.xml.bind.UnmarshalException - 有关联的例外: [java.io.FileNotFoundException: C:\Java\eclipse\eclipse\configSettingsFilePath = C:\ConfigSetting.xml(文件名、目录名或卷标语法不正确)] 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:246) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)

如果我直接在代码中使用“C:\ConfigSetting.xml”而不是从属性文件中读取路径,它会读取文件。

您能否建议我应该在属性文件中使用什么来指定路径?

【问题讨论】:

  • 您是否尝试过使用正斜杠?例如C:/ConfigSetting.xml
  • @ChristopherSchneider 您不在 Windows 中使用正斜杠。
  • @AleksandrMukhalov 技术上是正确的,但不是在 Java 中打开文件的上下文中。另外,至于问题,如果您尝试在C:/ 的根目录中打开某些内容,则您的应用程序可能无法读取它。尝试将其移动到更可能被读/写的目录,例如C:\Users\Username
  • 尝试将路径保存在属性文件中而不转义反斜杠。像这样:configSettingsFilePath = C:\\ConfigSetting.xml.
  • @AleksandrMukhalov 我从没说过有。当可以使用单个正斜杠时,它会更加冗长。

标签: java properties


【解决方案1】:

仅当 .jar 运行时读取文件才会失败。 从 Netbeans 中运行应用程序很好。 (路径不同)

另外,路径来自

URL resourceURL = MyClass.class.getResource("mydir/myfile.txt");

打印出路径是完美的。

此外,同一目录中的 mypicture.gif 也可以正常加载:

ImageIcon mypicture = new ImageIcon(imageURL, description)).getImage();

即使在运行 .jar 时。 IE:实际路径一定没问题。

这只是我尝试通过阅读的文本文件

InputStream input = new FileInputStream(fileName);

是它失败的时候——而且只有当它在罐子里时。

【讨论】:

  • 有人找到答案了吗?
  • 我也面临同样的问题.. 有人有解决方案吗?
【解决方案2】:

这可能是因为C:\ 不在类路径中。您正在使用getClassLoader(),它可能会返回ClassLoader

According to the docsClassLoader#getResource

此方法将首先在父类加载器中搜索 资源;如果 parent 为 null,则内置类加载器的路径 搜索到虚拟机。失败了,这种方法将 调用 findResource(String) 来查找资源。

该文件位于驱动器的根目录中,不会位于类路径或 VM 内置类加载器的路径中。如果这些失败,findResource 是后备。不知道findResource在哪里没有看到实现,但它似乎没有注意C:

解决方案是将属性文件移动到您的类路径中。通常,您会将这样的属性文件放在src/main/resources 文件夹中。

【讨论】:

  • 是的,这对我有用,但是当我们部署时,我希望用户可以访问配置文件以进行更新,因此希望将其放在可配置的路径中,因此我有上面的 src/main/resources 目录中的属性文件,其中包含用户操作的配置文件的文件路径。
  • 顺便说一句,我赞成你的答案,但由于我是新人,所以它没有显示:)
  • 然后您需要手动打开文件,而不是通过类加载器,并且可能将属性文件位置设置为启动参数。
  • 好的。将不得不这样做。谢谢!
猜你喜欢
  • 2014-06-30
  • 2019-05-24
  • 2019-09-30
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多