无法从属性文件中获取数据

时间:2009-07-03 04:02:29

标签: java properties

这是班级

package db;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Oshadha Gunawardena
 */
public class DBFacade {

    private static Connection c;

    public static void connect() throws Exception {
        if (c == null) {
            Properties prop = new Properties();
            FileInputStream fis = new FileInputStream("props.xml");
            prop.loadFromXML(fis);

            String dbUrl = prop.getProperty("dburl");
            String dbDriver = prop.getProperty("dbdriver");
            String dbUser = prop.getProperty("username");
            String dbPass = prop.getProperty("password");

            Class.forName(dbDriver).newInstance();

            c = DriverManager.getConnection(dbUrl, dbUser, dbPass);
        }
    }

    public static ResultSet fetch(String sql) throws Exception {
        connect();
        synchronized (c) {
            return c.createStatement().executeQuery(sql);
        }
    }

    public static void save(String sql) throws Exception {
        connect();
        synchronized (c) {
            c.createStatement().executeUpdate(sql);
        }
    }
}

我正在使用这个类作为我的数据库外观类,所以我的整个项目是一个Web应用程序,我正在调用这个fetch并使用servlet保存方法,但是当我尝试运行它时它抛出一个异常({{ 1}})。所有路径都设置正确props.xml文件在我的项目主目录中,当我尝试将数据打印到输出时它也可以工作。

java.io.FileNotFoundException

只有在我尝试部署和运行项目时才会出现问题。 注意:我使用NetBeans 6.1作为主IDE。

由于

3 个答案:

答案 0 :(得分:4)

如果从war文件加载,则应该使用

getClass().getResourceAsStream("props.xml");

答案 1 :(得分:2)

正如J-16 SDiZ所说,你的文件可能最终出现在war文件中 - 或者如果不是,那么你的工作目录可能不是你想象的那样。

你说props.xml在“项目主目录”中 - 部署后它在哪里?它是否在war文件中(在这种情况下,您需要使用getResourceAsStream(),但我怀疑Class.getClassLoader().getResourceAsStream("props.xml")更有可能工作:

InputStream input = null;  
try
{
    input YourClassName.class.getClassLoader.getResourceAsStream("props.xml");
    if (input == null)
    {
         // Throw an appropriate exception here to show you can't find your file
    }
    prop.loadFromXML(input);
}
finally
{
    if (input != null)
    {
        input.close();
    }
}

如果它真的 一个文件,你需要找到一些方法来编程它的目录,然后使用:

File file = new File(directory, "props.xml");
FileInputStream fis = new FileInputStream(file);
// And close it in a finally block as above

答案 2 :(得分:0)

如果您使用getResourceAsStream方法,那么您的属性文件必须位于类路径中。请参阅servlet容器的文档,了解它为类路径设置的内容。

但是,由于我们讨论的是JDBC连接,因此这不是正确的使用方法。获取连接的首选机制是使用DataSource

可以在here

找到在Tomcat中配置DataSource的说明
  

使用DataSource对象是使用DriverManager建立与数据源的连接的首选替代方法。它们类似于DriverManager类和DataSource接口都具有创建连接的方法,获取和设置连接的超时限制的方法,以及获取和设置用于记录的流的方法。

     然而,他们的差异比他们的相似之处更重要。与DriverManager不同,DataSource对象具有标识和描述其表示的数据源的属性。此外,DataSource对象与JavaTM命名和目录接口(JNDI)命名服务一起使用,并且与使用它的应用程序分开创建,部署和管理。驱动程序供应商将提供一个类,该类是作为其JDBC 2.0或3.0驱动程序产品的一部分的DataSource接口的基本实现。系统管理员使用JNDI命名服务注册DataSource对象以及使用向JNDI命名服务注册的DataSource对象获取与数据源的连接的应用程序所执行的操作将在本章后面介绍。

     

使用JNDI命名服务注册使DataSource对象比DriverManager有两大优势。首先,应用程序不需要像驱动程序管理器那样对驱动程序信息进行硬编码。程序员可以为数据源选择逻辑名称,并使用JNDI命名服务注册逻辑名称。应用程序使用逻辑名称,JNDI命名服务将提供与逻辑名称关联的DataSource对象。然后,可以使用DataSource对象创建与其表示的数据源的连接。

     

第二个主要优点是DataSource工具允许开发人员实现DataSource类,以利用连接池和分布式事务等功能。连接池可以通过重用连接而不是每次请求连接时创建新的物理连接来显着提高性能。使用分布式事务的能力使应用程序能够执行大型企业的重型数据库工作。