【Java】クラスパスからファイルを読み込む!(getResourceAsStream)
クラスパスからファイルを読み込むにはClassクラスのgetResourceAsStreamメソッドを使用します。
getResourceAsStreamメソッドは、クラスパスからプロパティファイルを読み込むメソッドとなります。
今回はClassクラスのgetResourceAsStreamメソッドを使って、クラスパスからファイルの読み込みを行います。
また、クラスローダーを使って、クラスパスからファイルの読み込む方法についても紹介していきます。
目次
クラスパスとは
クラスパスは、Java 実行環境がクラスおよび他のソースファイルを検索するパスでJavaコードがコンパイルしてできたクラスファイルの場所を指します。
例えば、クラスAがクラスBを使用する時、その「クラスB」の情報は、コンパイルされた後の「クラスBのクラスファイル」もしくはそのクラスファイルが格納されたjarファイルとなります。
そのため、この「クラスA」をコンパイルし、呼出して実行するには、クラスファイルやjarファイルから「クラスB」を探し出し、その情報を取得する必要があります。
この「クラスファイル」「jarファイル」のパス、もしくはこれらが置かれているディレクトリのパスを「クラスパス」といいます。
また、クラスパスは複数指定できるので、プロジェクトが大きくなって、たくさんのクラスファルがあったとしても、それら全てを同じディレクトリに格納する必要はありません。
getResourceAsStreamメソッドとは
ClassクラスのgetResourceAsStreamメソッドとは、クラスパスからプロパティファイルを読み込むメソッドとなります。
getResourceAsStreamメソッドの書き方
getResourceAsStreamメソッドの構文は下記となります。
1 |
クラス名.class.getResourceAsStream(ファイル名); |
パラメータ
⚫︎ ファイル名:
クラスパスから読み込みたいプロパティファイルを指定(ディレクトリの中にある場合は、絶対パスを指定)
getResourceAsStreamの()にファイル名を指定することで、指定したファイルを読み込むことができます。
その為、ディレクトリ内にファイルが存在する場合は、絶対パスを指定する必要があります。
クラスパスからファイルを読み込むサンプルコード
クラスパスからファイルを読み込むサンプルコードを紹介します。
classpathFile.propertiesは、クラスパス直下(Main.classと同じディレクトリ)に用意します。
その状態でMain.javaを実行します、
classpathFile.properties
1 2 |
name = 田中太郎 content = 風邪をひきました |
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// クラスバスからファイルを読み込む import java.io.InputStream; import java.util.Properties; public class Main { public static void main(String[] args) throws Exception { //入カストリーム InputStream input = Main.class.getResourceAsStream( "classpathFile.properties"); // プロパティファイルとして読み込み Properties proper = new Properties(); proper.load(input); // 入力ストリームを閉じる input.close(); //読み込んだ内容を表示 System.out.println("contentの値:" + proper.getProperty("content")); } } |
出力結果
contentの値:風邪をひきました
Main.javaを実行するとclasspassFile.propertiesのcontentの値が出力されます。
クラスローダでクラスパスからファイルを読み込む場合
クラスローダでクラスパスからファイルを読み込むにはgetClassLoaderメソッドを使用します。
クラスローダとは、クラスのロードやリソース(ファイル)の検索を担当するオブジェクトで、「java.lang.ClassLoader」を継承したクラスのインスタンスとなります。
Javaはクラスファイルが必要となったときに、動的にクラスをメモリ上にロードします。
これを行うのが抽象クラス「java.lang.ClassLoader」を継承したクラスローダの役割です。
通常はプログラムを起動したときに指定されたクラスパスを使ってファイルシステムやJarファイル内からクラスファイルをロードしますが、クラスローダを入れ替えることでこれらの動作を変えることができます。
classpathFile.properties
1 2 |
name = 田中太郎 content = 風邪をひきました |
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// クラスバスからファイルを読み込む import java.io.InputStream; import java.util.Properties; public class Main { public static void main(String[] args) throws Exception { //入カストリーム InputStream input = Main.class.getClassLoader().getResourceAsStream( "classpathFile.properties"); // プロパティファイルとして読み込み Properties proper = new Properties(); proper.load(input); // 入力ストリームを閉じる input.close(); //読み込んだ内容を表示 System.out.println("contentの値:" + proper.getProperty("content")); } } |
出力結果
contentの値:風邪をひきました
今回のポイント
getResourceAsStreamでクラスパからファイルを読み込む
クラスパスからファイルを読み込むにはClassクラスのgetResourceAsStreamメソッドを使用する。
⚫︎ ClassクラスのgetResourceAsStreamメソッドはパラメータで指定されたリソースを探す
⚫︎ getResourceAsStreamメソッドで指定されたリソースを探し、そこからデータを読み込める「InputStream」インスタンスを返す
(リソース名は、そのクラスから見た相対指定となる)
⚫︎ classpathFileクラスはデフォルトパッケージであるため、クラスファイルはクラスパス直下にあり、そのためclasspathFile.propertiesもクラスパス直下にある必要がある
⚫︎ リソース名の先頭に「/」を付けるとクラスパス直下から見た絶対パスとなる
(例えば、リソース名が「/study/classpathFile.properties」だった場合、クラスパスのみの「study」ディレクトリの中の「classpathFile.properties」というファイルを読み込む)
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。