【Java】クラスパスからファイルを読み込む!(getResourceAsStream)

クラスパスからファイルを読み込むにはClassクラスのgetResourceAsStreamメソッドを使用します。

getResourceAsStreamメソッドは、クラスパスからプロパティファイルを読み込むメソッドとなります。

今回はClassクラスのgetResourceAsStreamメソッドを使って、クラスパスからファイルの読み込みを行います。

また、クラスローダーを使って、クラスパスからファイルの読み込む方法についても紹介していきます。

クラスパスとは

クラスパスは、Java 実行環境がクラスおよび他のソースファイルを検索するパスでJavaコードがコンパイルしてできたクラスファイルの場所を指します。

例えば、クラスAがクラスBを使用する時、その「クラスB」の情報は、コンパイルされた後の「クラスBのクラスファイル」もしくはそのクラスファイルが格納されたjarファイルとなります。

そのため、この「クラスA」をコンパイルし、呼出して実行するには、クラスファイルやjarファイルから「クラスB」を探し出し、その情報を取得する必要があります。
この「クラスファイル」「jarファイル」のパス、もしくはこれらが置かれているディレクトリのパスを「クラスパス」といいます。

また、クラスパスは複数指定できるので、プロジェクトが大きくなって、たくさんのクラスファルがあったとしても、それら全てを同じディレクトリに格納する必要はありません。

getResourceAsStreamメソッドとは

ClassクラスのgetResourceAsStreamメソッドとは、クラスパスからプロパティファイルを読み込むメソッドとなります。

getResourceAsStreamメソッドの書き方

getResourceAsStreamメソッドの構文は下記となります。

パラメータ

⚫︎ ファイル名:
クラスパスから読み込みたいプロパティファイルを指定(ディレクトリの中にある場合は、絶対パスを指定)

getResourceAsStreamの()にファイル名を指定することで、指定したファイルを読み込むことができます。

その為、ディレクトリ内にファイルが存在する場合は、絶対パスを指定する必要があります。

クラスパスからファイルを読み込むサンプルコード

クラスパスからファイルを読み込むサンプルコードを紹介します。

classpathFile.propertiesは、クラスパス直下(Main.classと同じディレクトリ)に用意します。

その状態でMain.javaを実行します、

classpathFile.properties

Main.java

出力結果

contentの値:風邪をひきました

Main.javaを実行するとclasspassFile.propertiesのcontentの値が出力されます。

クラスローダでクラスパスからファイルを読み込む場合

クラスローダでクラスパスからファイルを読み込むにはgetClassLoaderメソッドを使用します。

クラスローダとは、クラスのロードやリソース(ファイル)の検索を担当するオブジェクトで、「java.lang.ClassLoader」を継承したクラスのインスタンスとなります。

Javaはクラスファイルが必要となったときに、動的にクラスをメモリ上にロードします。
これを行うのが抽象クラス「java.lang.ClassLoader」を継承したクラスローダの役割です。

通常はプログラムを起動したときに指定されたクラスパスを使ってファイルシステムやJarファイル内からクラスファイルをロードしますが、クラスローダを入れ替えることでこれらの動作を変えることができます。

classpathFile.properties

Main.java

出力結果

contentの値:風邪をひきました

今回のポイント

getResourceAsStreamでクラスパからファイルを読み込む

クラスパスからファイルを読み込むにはClassクラスのgetResourceAsStreamメソッドを使用する。

⚫︎ ClassクラスのgetResourceAsStreamメソッドはパラメータで指定されたリソースを探す

⚫︎ getResourceAsStreamメソッドで指定されたリソースを探し、そこからデータを読み込める「InputStream」インスタンスを返す
(リソース名は、そのクラスから見た相対指定となる)

⚫︎ classpathFileクラスはデフォルトパッケージであるため、クラスファイルはクラスパス直下にあり、そのためclasspathFile.propertiesもクラスパス直下にある必要がある

⚫︎ リソース名の先頭に「/」を付けるとクラスパス直下から見た絶対パスとなる
(例えば、リソース名が「/study/classpathFile.properties」だった場合、クラスパスのみの「study」ディレクトリの中の「classpathFile.properties」というファイルを読み込む)

Writer

ST

株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。

最新の案件情報