Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有方法从项目外部的属性文件加载信息';项目作为JAR导出时的目录?_Java - Fatal编程技术网

Java 是否有方法从项目外部的属性文件加载信息';项目作为JAR导出时的目录?

Java 是否有方法从项目外部的属性文件加载信息';项目作为JAR导出时的目录?,java,Java,我需要将数据库凭据保存在位于项目文件夹/结构/类路径(即C:/Parent\u name/config/config.properties)之外的属性文件中。项目(C:/Parent\u name/Tomcat/project\u name/)作为JAR导出,并用于其他应用程序(C:/Tomcat/webapps/app\u 1/WEB-INF/lib/project\u name.JAR),然后部署到Tomcat服务器 我发现我无法执行简单的FileInputStream,因为该文件需要是类路

我需要将数据库凭据保存在位于项目文件夹/结构/类路径(即C:/Parent\u name/config/config.properties)之外的属性文件中。项目(C:/Parent\u name/Tomcat/project\u name/)作为JAR导出,并用于其他应用程序(C:/Tomcat/webapps/app\u 1/WEB-INF/lib/project\u name.JAR),然后部署到Tomcat服务器

我发现我无法执行简单的FileInputStream,因为该文件需要是类路径的一部分,并且我需要该文件位于项目之外,以便DBA可以在需要时轻松更新凭据。getResourceAsSteam()返回空指针异常

下面是两个无法实现我需要的代码示例:

文件输入蒸汽

private static Object readConfigFile()  {

    try (InputStream input = new FileInputStream("C:\\Parent_name\\config\\config.properties")) {

        Properties prop = new Properties();

        // load a properties file
        prop.load(input);

        // get the property value and print it out
        System.out.println(prop.getProperty("db.url"));
        System.out.println(prop.getProperty("db.user"));
        System.out.println(prop.getProperty("db.password"));
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return null;
}
getresrouceasteam()

是的,有一种方法可以“当项目作为JAR导出时,有没有方法从项目目录之外的属性文件加载信息?”

  • 正如VGR在其非常有用的评论中指出的那样,作为JAR导出的项目与读取文件系统中常规文件的能力没有关系

  • 我的问题是找不到文件。我为找到正确答案而采取的调试步骤是列出目录中的所有文件

  • 在这里,我发现config.properties实际上是config.properties.txt

  • 为了创建正确的config.properties文件,我在eclipse中创建了一个新文件,名为config.properties,然后将其复制/粘贴到C://Parent\u name//config中。我使用以下代码读取文件并打印其值:

  • 听起来你好像不想使用资源。实际上,您可能会使用普通文件。也许在用户文件夹中检查一个文件,如果它不存在,创建一个他们可以填充的文件。我不确定为什么你认为你不能使用一个普通的
    FileInputStream
    ,这就是他们的目的——文件输入流,在文档中这样说:“从文件系统中的文件获取输入字节”。您现在拥有的资源必须位于项目类路径中。您的第一个示例不是一个
    FileInputStream
    ,而是一个资源流。“我不能做一个简单的FileInputStream,因为该文件需要是类路径的一部分”事实上,情况正好相反。资源必须位于类路径或模块路径中;FileInputStream实际上是用来读取文件系统上的任何(可读)文件的;文件路径是文件路径:如果文件存在并且用户有权访问它,它应该可以正常工作。如果没有,那么其他的东西就错了。Java代码是否在.jar文件中运行与读取文件系统中常规文件的能力无关。考虑使用而不是FielePixSt流,因为前者将给您提供更具信息性的异常,例如,如果文件存在,但您的程序没有读取它的权限。当您正在进行涉及文件的编程时,提出文件浏览器(Windows + E)是一个好主意,然后转到查看、选项,然后选择“查看”选项卡,取消选中“隐藏已知文件类型的扩展名”。这将防止Windows诱使您相信某个文件的名称与其实际名称不同。程序员需要知道真实的文件名,而不是“美化”的名称。
    private static Object readConfigFile() {
            try {
                Class cls = Class.forName("SQLCredentials");
    
                // returns the ClassLoader object associated with this Class
                ClassLoader cLoader = cls.getClassLoader();
                InputStream input = cLoader.getResourceAsStream("C:/Parent_name/config/config.properties");
    
                Properties prop = new Properties();
    
                // load a properties file
                prop.load(input);
    
                // get the property value and print it out
                System.out.println(prop.getProperty("db.url"));
                System.out.println(prop.getProperty("db.user"));
                System.out.println(prop.getProperty("db.password"));
            } catch (IOException | ClassNotFoundException ex) {
                ex.printStackTrace();
            }
    
            return null;
        }
    
         String[] pathnames;
    
         // Creates a new File instance by converting the given pathname string
         // into an abstract pathname
         File f = new File("C:\\Parent_name\\config");
    
         // Populates the array with names of files and directories
         pathnames = f.list();
    
         // For each pathname in the pathnames array
         for (String pathname : pathnames) {
             // Print the names of files and directories
             System.out.println(pathname);
         }
    
    private static Object readConfigFile()  {
    
      
     try (InputStream input = Files.newInputStream(Paths.get("C:\\Parent_name\\config\\config.properties"))) {
        
         Properties prop = new Properties();
    
         // load a properties file
         prop.load(input);
    
         // get the property value and print it out
         System.out.println(prop.getProperty("dev.url"));
         System.out.println(prop.getProperty("dev.user"));
         System.out.println(prop.getProperty("dev.password"));
     } catch (IOException ex) {
        ex.printStackTrace();
     }
    
        return null;
    }