Webアプリケーションからファイルを読み込む場合、システムに依存したパス名を指定して入力ストリームを取得して行います。このTipsでは、Webアプリケーション内の相対パスを絶対パスに変換し、ファイルを読み込む方法を紹介します。
ファイルを読み込む場合,コンストラクタにファイルのパス名を指定してjava.io.FileInputStreamクラスを利用することが多いと思います。ファイルのパス名は,ファイルシステムに依存した相対パスか絶対パスです。相対パスを指定した場合の基準となるディレクトリは,Tomcatを単独で起動した場合は,TOMCAT_HOME/binディレクトリ,Eclipse+Sysdeo Tomcatプラグインの環境でEclipseがインストールされたディレクトリになるなど,動作環境によって異なります。そのため,Webアプリケーション内の相対パスをそのまま指定しても,目的のファイルを読み込むことはできません。
Webアプリケーション内の相対パスからファイルシステムに依存した絶対パスを取得する場合は,javax.servlet.ServletContextオブジェクト(インタフェース)を利用するのが簡単です。ServletContextオブジェクトは,サーブレットは初期化時に受け取るjavax.servlet.ServletConfigオブジェクトに含まれているもので,サーブレットはこれを受け取り・保持します。サーブレットは,初期化後であればgetServletContextメソッドを使っていつでもServletContextオブジェクトを取得できます。たとえばdoGetメソッド内なら,次のように記述できます。
ServletContext context = this.getServletContext();
こうして取得したServletContextオブジェクトには,相対パスに対応した絶対パスを返すgetRealPathメソッドが用意されています。これを使って入力ストリームを取得し,ファイルを読み込む処理は,次のように記述できます。
String realPath = this.getServletContext().getRealPath("/WEB-INF/name.txt");
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(realPath));
// 読み込み処理
in.close();
getRealPathメソッドに与えるパス名は,Webアプリケーション内(コンテキストルート)の相対パス名です。WebアプリケーションがC:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\Testにある場合,getRealPathメソッドに"name.txt"を与えると,C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\Test\name.txtを取得できます。
なお,パス名としてWebアプリケーション外のファイルを指定した場合,正しいパス名を取得することはできません。たとえば"http://localhost:8080/index.html"を指定した場合,絶対パス名としてC:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\Test\http:\localhost\index.htmlのようなパス名が帰ってきてしまい,正しい絶対パス名は取得できません。ServletContextオブジェクトを使った絶対パスの取得は,Webアプリケーション内に限定することに注意してください。
「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.