- PR -

【再質問】「ファイルの相対パス指定について」

投稿者投稿内容
NOB
常連さん
会議室デビュー日: 2004/03/02
投稿数: 49
投稿日時: 2004-03-02 18:50
はじめまして、NOBと申します。過去質問「ファイルの相対パス指定について」にもありましたが改めて投稿させて頂きます。
データベースが変更になっても大丈夫なように定義ファイルをPropertiesに定義したいのですが、絶対パスだと取得できるのに相対パスだと取得できません。環境設定でも何か抜けているのでしょうか?


【エラー内容】
java.io.FileNotFoundException: dbConnect.properties (指定されたファイルが見つかりません。)

【問題のサーブレット】

/*
* クラス名    : サーブレットサンプル(テーブルの内容を表示する。)
*
* バージョン情報 : ver0
*
* 作成日付    : 2004/03/02
*
* 作成者     : nob
*
* 著作権     :
*/
import java.io.*;
import java.sql.*;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class test extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
Connection conn = null; // コネクション格納エリア
Statement stmt = null; // ステートメント格納エリア
ResultSet rs = null; // レコードセット格納エリア
String strDriver = "";
String strUrl = "";
String strUser = "";
String strPass = "";
String strSqlQuery = "";
String wk_DEPTNO = "";
String wk_DNAME = "";
String wk_LOC = "";

// ContentTypeを設定
response.setContentType("text/html; charset=Shift_JIS");
// 出力用PrintWriterを取得
PrintWriter out = response.getWriter();

try {
//プロファイル(パラメータ)読込み定義

Properties prop = new Properties();

//----> 相対パスを取得 wk_pathには「/oracle_web」がはいる。
String wk_path = request.getContextPath();

//----> 絶対パスでは問題なく取得できることを確認。
// prop.load(new FileInputStream("E:/java_source/oracle_web/WEB-INF/classes/dbConnect.properties"));

//----> 下記4箇所にdbConnect.propertiesを移動して動作を確認。
//----> ×(1) E:/java_source
//----> ×(2) E:/java_source/oracle_web
//----> ×(3) E:/java_source/oracle_web/WEB-INF
//----> ×(4) E:/java_source/oracle_web/WEB-INF/classes/

prop.load(new FileInputStream("dbConnect.properties"));
//パラメータ取得
strUrl = prop.getProperty("oraurl");
strDriver = prop.getProperty("orajdbc");
strUser = prop.getProperty("orauser");
strPass = prop.getProperty("orapass");
// データベース接続
Class.forName(strDriver);
conn = DriverManager.getConnection(strUrl,strUser,strPass);
// ステートメント生成
stmt = conn.createStatement();
// Sql文作成
strSqlQuery =
"select DEPTNO,DNAME,LOC from dept" ;
// Sql文発行
rs = stmt.executeQuery(strSqlQuery);

out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Error</title>");
out.println("</head>");
out.println("<body>");
while (rs.next()) {
// データ取得
wk_DNAME = rs.getString("DNAME");
wk_LOC = rs.getString("LOC");
// データ表示
out.println("" + wk_DNAME + "");
out.println("" + wk_LOC + "");
out.println("<br>");
}
out.println("</body>");
out.println("</html>");

// データベース切離
rs.close(); // レコードセットクローズ
stmt.close(); // ステートメントクローズ
conn.close(); // コネクションクローズ

}
catch (Exception e) {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Error</title>");
out.println("</head>");
out.println("<body>");
out.println("" + e + "");
out.println("</body>");
out.println("</html>");
}
finally {

}
}
}



[ メッセージ編集済み 編集者: NOB 編集日時 2004-03-02 22:28 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-03-02 18:54
file.getRealPath().toString()
でどのパスを見に行ってるか確認してみてはいかがでしょうか?
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-03-02 19:01
FileInputStreamで直接オープンしてPropertiesを生成するのではなく、
java.lang.ClassLoader#getResourceAsStream(String)を使って取得したInputStreamから
Propertiesを生成されたら如何でしょうか?
NOB
常連さん
会議室デビュー日: 2004/03/02
投稿数: 49
投稿日時: 2004-03-02 21:35
おばけさん・インギさん、早速のレスありがとうございます。
早速インギさんのgetRealPath()を試してみました。

結果は、
String path = getServletContext().getRealPath("")
→E:\java_source\oracle_web

でしたのでファイルをE:\java_source\oracle_web\dbConnect.propertiesとし、
実行してみましたがやはり同じでした。うーむ、次はおばけさん案を試してみますね。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-03-02 22:21
引用:

prop.load(new FileInputStream("dbConnect.properties"));


こういう「相対パス」はgetRealPath()で取得できるディレクトリなど
「自分にとって都合のよさそうなパス」が基準になっているわけではない
ことを認識していてください。
あくまでもサーブレットコンテナが認識している「カレントディレクトリ」
が基準なので、どこになるかは環境依存です。

getReadPath()で求めたディレクトリを基準にしたいなら、getRealPath()
で求めた値を元に、完全なファイル名を作成してそれを使うのでは…。

で、私としては WEB-INF/classes/ に入れるのを前提におばけさん
の書いている方法で何も問題ない気がします。
NOB
常連さん
会議室デビュー日: 2004/03/02
投稿数: 49
投稿日時: 2004-03-03 00:35
JMさんもレスありがとうございます。先ほどからおばけさんのコメントを実践しているのですが、コンパイルはエラーなしでとおるものの戻り値がエラーとなってしまいます。E:/java_source/oracle_web/WEB-INF/classes/dbConnect.propertiesにはちゃんと存在するのですが。そこですみませんがコーディングサンプルなんてありますか?無茶いってすみません。


Properties prop = new Properties();
Class inClass=null;
InputStream inStream=null;
inClass=getClass();
inStream=inClass.getResourceAsStream("dbConnect.properties");
prop.load(inStream);

strUrl = prop.getProperty("oraurl");
↑ここでNullを取得してしまう
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-03-03 00:55
引用:

NOBさんの書き込み (2004-03-03 00:35) より:
Properties prop = new Properties();
Class inClass=null;
InputStream inStream=null;
inClass=getClass();
inStream=inClass.getResourceAsStream("dbConnect.properties");
prop.load(inStream);

strUrl = prop.getProperty("oraurl");
↑ここでNullを取得してしまう


Properties#load(InputStream)が例外を発生させないのなら、
プロパティファイルは見えておりその取得は成功していると思います。
Properties#getProperty(String)がnullを返すのなら、
oraurlというエントリが本当にあるのかどうか確認してみてはどうでしょうか。
NOB
常連さん
会議室デビュー日: 2004/03/02
投稿数: 49
投稿日時: 2004-03-03 07:40
koeさん、ありがとうございます。プロパティファイルは見えていますかあ。
実は最初のコーディングは下記のとおりでして、こんなエラーが発生してました。きっとこのエラーは「oraurlがないよ」とのことだったんですね。
となると「dbConnect.properties」のコーディングが悪いのかなあ?

【エラー内容】
java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key oraurl

【問題のサーブレット(初版)】
/*
* クラス名    : サーブレットサンプル(テーブルの内容を表示する。)
*
* バージョン情報 : ver0
*
* 作成日付    : 2004/03/02
*
* 作成者     : nob
*
* 著作権     :
*/
import java.io.*;
import java.sql.*;
import java.io.IOException;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class test extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
Connection conn = null; // コネクション格納エリア
Statement stmt = null; // ステートメント格納エリア
ResultSet rs = null; // レコードセット格納エリア
String strDriver = "";
String strUrl = "";
String strUser = "";
String strPass = "";
String strSqlQuery = "";
String wk_DEPTNO = "";
String wk_DNAME = "";
String wk_LOC = "";

// ContentTypeを設定
response.setContentType("text/html; charset=Shift_JIS");
// 出力用PrintWriterを取得
PrintWriter out = response.getWriter();

try {
//プロファイル(パラメータ)読込み定義
//プロパティファイルバンドル
ResourceBundle objRB=ResourceBundle.getBundle("dbConnect");
//パラメータ取得
strUrl = objRB.getString("oraurl");
strDriver = objRB.getString("orajdbc");
strUser = objRB.getString("orauser");
strPass = objRB.getString("orapass");
// データベース接続
Class.forName(strDriver);
conn = DriverManager.getConnection(strUrl,strUser,strPass);
// ステートメント生成
stmt = conn.createStatement();
// Sql文作成
strSqlQuery =
"select DEPTNO,DNAME,LOC from dept" ;
// Sql文発行
rs = stmt.executeQuery(strSqlQuery);

out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Error</title>");
out.println("</head>");
out.println("<body>");
while (rs.next()) {
// データ取得
wk_DNAME = rs.getString("DNAME");
wk_LOC = rs.getString("LOC");
// データ表示
out.println("" + wk_DNAME + "");
out.println("" + wk_LOC + "");
out.println("<br>");
}
out.println("</body>");
out.println("</html>");

// データベース切離
rs.close(); // レコードセットクローズ
stmt.close(); // ステートメントクローズ
conn.close(); // コネクションクローズ

}
catch (Exception e) {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Error</title>");
out.println("</head>");
out.println("<body>");
out.println("" + e + "");
out.println("</body>");
out.println("</html>");
}
finally {

}
}
}


【dbConnect.properties】

#dbConnect properties
#Thu mar 2 2004
oraurl=jdbc:oracle:thin:@127.0.0.1:1521:orcl
orajdbc=oracle.jdbc.driver.OracleDriver
orauser=scott
orapass=tiger




スキルアップ/キャリアアップ(JOB@IT)