package cn.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import cn.test.ImageTest;
public class JdbcUtils {
private static Properties config = new Properties();
static {
try {
System.out.println(123);
InputStream in = null;
Reader reader = null;
// @SuppressWarnings("resource")
try {
// reader = new FileReader("db.properties");
// ImageTest im = new ImageTest();
//静态代码中不能够用文件的方式加载文件??????????????
// FileInputStream fis = new FileInputStream(new File("db.properties"));
in = new BufferedInputStream(new FileInputStream(
new File("db.properties")));
} catch (Exception e) {
e.printStackTrace();
System.out.println("error");
} finally {
// in.close();
}
// FileInputStream fis = new FileInputStream("classpath:db.properties");
config.load(in);
// config.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
System.out.println(1456);
//装载并实例化这个类
Class.forName(config.getProperty("driver"));
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(config.getProperty("url"),config.getProperty("username"),config.getProperty("password"));
}
public static void release(Connection conn , Statement st ,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try {
st.close();
} catch (Exception e) {
e.printStackTrace();
}
st=null;
}
if(conn != null ){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}
关于Properties的静态代码块读取方式,效率和安全性都很高,
但是怀疑有没有其他的方法可以读取到输入流,于是在Web项目下测试了一下,
发现会报文件找不到的错误。
原因是因为File是从Web应用的根目录读取文件的,
并不是从src和content中,所以放到这两个文件夹中都无法读取到文件,
与静态代码块无关。
结论:将db.properties文件放到应用根目录即可。
File是从应用启动根目录/绝对路径开始读取文件的。同类的FileReader应该也是。
而ClassLoader.getSystemResource(name)则是从类路径进行读取文件,会更方便一些?