[解決済み] getResourceAsStream() vs FileInputStream (ファイルインプットストリーム)
質問
ウェブアプリでファイルを読み込もうとすると
FileNotFound
を使用すると、例外が発生します。
FileInputStream
. しかし、同じパスを使用して、次のようにすると、ファイルを読み込むことができました。
getResourceAsStream()
.
この2つの方法の違いは何でしょうか?また、なぜ一方はうまくいき、もう一方はうまくいかないのでしょうか?
どのように解決するのですか?
その
java.io.File
とコンソートはローカルディスクのファイルシステム上で動作します。問題の根本的な原因は
相対
のパスは
java.io
は、現在の作業ディレクトリに依存します。すなわち、JVM(あなたの場合、ウェブサーバーのもの)が開始されるディレクトリです。これは、例えば
C:\Tomcat\bin
または全く別のものですが、このように
ではなく
C:\Tomcat\webapps\contextname
といった具合になります。通常のEclipseプロジェクトでは、次のようになります。
C:\Eclipse\workspace\projectname
. 現在の作業ディレクトリは、次のようにして知ることができます。
System.out.println(new File(".").getAbsolutePath());
しかし、作業ディレクトリはプログラムではどうにも制御できません。本当は
絶対
のパスを
File
相対パスの代わりにAPIを使用します。例
C:\full\path\to\file.ext
.
Java(Web)アプリケーションでは、絶対パスをハードコードしたり推測したりすることは避けたいものです。それは移植性の問題でしかありません(つまり、システムXでは動作するが、システムYでは動作しない)。通常のやり方は、その種のリソースを
クラスパス
または、クラスパスにフルパスを追加します。
src
フォルダとビルドパスをそれぞれ指定します。) こうすることで、これらのファイルを
ClassLoader
によって
ClassLoader#getResource()
または
ClassLoader#getResourceAsStream()
. これはクラスパスの "ルート" からの相対パスでファイルを見つけることができます。ウェブアプリケーション(あるいは複数のクラスローダを使用する他のアプリケーション)では
ClassLoader
が返すように
Thread.currentThread().getContextClassLoader()
を使用することで、ウェブアプリケーションのコンテキストの外側を見ることができます。
Webappsにおけるもうひとつの選択肢は
ServletContext#getResource()
とその対極にある
ServletContext#getResourceAsStream()
. にあるファイルにアクセスすることができます。
web
フォルダを含む、Webapp プロジェクトの
/WEB-INF
フォルダーに格納されます。また
ServletContext
はサーブレットの中で、継承された
getServletContext()
メソッドを使えば、そのまま呼び出すことができます。
こちらもご覧ください。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] メソッドは、タイプ内の別のメソッドと同じ消去を持つ
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?
-
[解決済み】JavaリフレクションのgetFieldsとgetDeclaredFieldsの違いは何ですか?
-
[解決済み】Joda-Timeの2つの日付の間の日数について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
をインスタンス化することができません。
-
プロローグでのコンテンツは禁止されています
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
linux run jarfile Invalid or corrupt jarfile error.
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
[解決済み】サーブレットベースのアプリケーションで、設定リソースファイルをどこに置き、どのように読み込むか?