在一个工程中无法使用相对路径

时间:2022-11-29 00:02:37
环境是MyEclipse10.7,其他项目均能正常使用,本来这个项目下午都还能用,可晚上却不能用了,就一直报错:

java.io.FileNotFoundException: dbinfo.properties (系统找不到指定的文件。)
如图:
在一个工程中无法使用相对路径

求大神指点啊!!!!

12 个解决方案

#1


就是画线那句报错,如果改成绝对路径,就运行正常了,有办法解决吗?

#2


把dbinfo.property放在src下面 一般不放在最外层 然后用下面的代码获取

fileInputStream = this.getClass().getClassLoader().getResourceAsStream("dbinfo.property"); 

#3


把property文件放到src下就好了

#4


引用 3 楼 qiyuexuel 的回复:
把property文件放到src下就好了

依旧不行啊,还是报找不到文件。

#5


引用 4 楼 DukeSoft 的回复:
Quote: 引用 3 楼 qiyuexuel 的回复:

把property文件放到src下就好了

依旧不行啊,还是报找不到文件。


public class DBUtil {
private static DataSource ds;
/**
 * 创建线程局部变量,提供拦截器的事务支持
 */
private static ThreadLocal<Connection> connHolder = new ThreadLocal<Connection>();
/**
 * 加载配置文件,完成连接池的建立
 */
static{
Properties properties = new Properties();
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
properties.load(in);
ds = BasicDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
 * 从连接池中获取连接
 * @return MYSQL连接
 * @throws Exception SQL异常
 */
public static Connection getConnection() throws Exception{
Connection conn = connHolder.get();
if(conn == null || conn.isClosed()){
conn = ds.getConnection();
connHolder.set(conn);
}
System.out.println("SQL连接:" + conn);
return conn;
}
/**
 * 释放连接
 * @param conn MYSQL连接
 * @throws Exception SQL异常
 */
public static void closeConnection() throws Exception{
Connection conn = connHolder.get();
if(conn != null){
conn.close();
}
}
/**
 * 设置conn连接的手动提交
 * @throws Exception
 */
public static void beganTransaction() throws Exception{
DBUtil.getConnection().setAutoCommit(false);
}
/**
 * 提交事务
 * @throws Exception
 */
public static void commit() throws Exception{
DBUtil.getConnection().commit();
System.out.println("commit成功");
}
/**
 * 回滚事务
 * @throws Exception
 */
public static void rollback() throws Exception{
DBUtil.getConnection().rollback();
}

public static void main(String[] args){
try {
System.out.println(DBUtil.getConnection());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


可能是你的流读不出来 直接用把

#6


先放到src下  再用这句
InputStream in = this.class.getClassLoader().getResourceAsStream("dbcp.properties");

给你一个读取配置文件信息的方法

        private static Properties prop = null;

public  String getProperty(String key) {
if (prop == null) {
prop = new Properties();
InputStream is = this.class.getClassLoader()
.getResourceAsStream("xxx.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return prop.getProperty(key);
}

#7


引用 6 楼 qiyuexuel 的回复:
先放到src下  再用这句
InputStream in = this.class.getClassLoader().getResourceAsStream("dbcp.properties");

给你一个读取配置文件信息的方法

        private static Properties prop = null;

public  String getProperty(String key) {
if (prop == null) {
prop = new Properties();
InputStream is = this.class.getClassLoader()
.getResourceAsStream("xxx.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return prop.getProperty(key);
}


我是放在静态代码块的,不能用this。

#8


引用 7 楼 DukeSoft 的回复:
我是放在静态代码块的,不能用this。

把this换成该类名

#9


文件放的位置不对,起码要把文件放到webroot下或者他的子目录,不然不会被部署到tomcat的webapp下面

#10


放那能找到才怪

#11


不在同个目录,找不到 

#12


引用 8 楼 qiyuexuel 的回复:
Quote: 引用 7 楼 DukeSoft 的回复:


我是放在静态代码块的,不能用this。

把this换成该类名

问题解决了,原来是因为web应用的主目录根本和项目目录没关系,使用你说的类加载解决了这个问题。感谢!

#1


就是画线那句报错,如果改成绝对路径,就运行正常了,有办法解决吗?

#2


把dbinfo.property放在src下面 一般不放在最外层 然后用下面的代码获取

fileInputStream = this.getClass().getClassLoader().getResourceAsStream("dbinfo.property"); 

#3


把property文件放到src下就好了

#4


引用 3 楼 qiyuexuel 的回复:
把property文件放到src下就好了

依旧不行啊,还是报找不到文件。

#5


引用 4 楼 DukeSoft 的回复:
Quote: 引用 3 楼 qiyuexuel 的回复:

把property文件放到src下就好了

依旧不行啊,还是报找不到文件。


public class DBUtil {
private static DataSource ds;
/**
 * 创建线程局部变量,提供拦截器的事务支持
 */
private static ThreadLocal<Connection> connHolder = new ThreadLocal<Connection>();
/**
 * 加载配置文件,完成连接池的建立
 */
static{
Properties properties = new Properties();
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
properties.load(in);
ds = BasicDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
 * 从连接池中获取连接
 * @return MYSQL连接
 * @throws Exception SQL异常
 */
public static Connection getConnection() throws Exception{
Connection conn = connHolder.get();
if(conn == null || conn.isClosed()){
conn = ds.getConnection();
connHolder.set(conn);
}
System.out.println("SQL连接:" + conn);
return conn;
}
/**
 * 释放连接
 * @param conn MYSQL连接
 * @throws Exception SQL异常
 */
public static void closeConnection() throws Exception{
Connection conn = connHolder.get();
if(conn != null){
conn.close();
}
}
/**
 * 设置conn连接的手动提交
 * @throws Exception
 */
public static void beganTransaction() throws Exception{
DBUtil.getConnection().setAutoCommit(false);
}
/**
 * 提交事务
 * @throws Exception
 */
public static void commit() throws Exception{
DBUtil.getConnection().commit();
System.out.println("commit成功");
}
/**
 * 回滚事务
 * @throws Exception
 */
public static void rollback() throws Exception{
DBUtil.getConnection().rollback();
}

public static void main(String[] args){
try {
System.out.println(DBUtil.getConnection());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


可能是你的流读不出来 直接用把

#6


先放到src下  再用这句
InputStream in = this.class.getClassLoader().getResourceAsStream("dbcp.properties");

给你一个读取配置文件信息的方法

        private static Properties prop = null;

public  String getProperty(String key) {
if (prop == null) {
prop = new Properties();
InputStream is = this.class.getClassLoader()
.getResourceAsStream("xxx.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return prop.getProperty(key);
}

#7


引用 6 楼 qiyuexuel 的回复:
先放到src下  再用这句
InputStream in = this.class.getClassLoader().getResourceAsStream("dbcp.properties");

给你一个读取配置文件信息的方法

        private static Properties prop = null;

public  String getProperty(String key) {
if (prop == null) {
prop = new Properties();
InputStream is = this.class.getClassLoader()
.getResourceAsStream("xxx.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return prop.getProperty(key);
}


我是放在静态代码块的,不能用this。

#8


引用 7 楼 DukeSoft 的回复:
我是放在静态代码块的,不能用this。

把this换成该类名

#9


文件放的位置不对,起码要把文件放到webroot下或者他的子目录,不然不会被部署到tomcat的webapp下面

#10


放那能找到才怪

#11


不在同个目录,找不到 

#12


引用 8 楼 qiyuexuel 的回复:
Quote: 引用 7 楼 DukeSoft 的回复:


我是放在静态代码块的,不能用this。

把this换成该类名

问题解决了,原来是因为web应用的主目录根本和项目目录没关系,使用你说的类加载解决了这个问题。感谢!