word.txt をプロジェクト ルート フォルダーの子として直接配置し、src のピアとして配置します。
Project_Root
src
word.txt
免責事項:この特定のケースでこれが機能する理由と、他のケースでは機能しない理由を説明したいと思います。
機能する理由:
File
または他のバリアントを使用する場合、 「作業ディレクトリ」FileXxx
に相対的なファイルシステム上のファイルを探しています。作業ディレクトリは、次のように記述できます。
コマンドラインから実行する場合
C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1
作業ディレクトリはC:\EclipseWorkspace\ProjectRoot\bin
. IDE (少なくとも私が使用したすべての IDE) では、作業ディレクトリはProjectRoot
. したがって、ファイルが にある場合ProjectRoot
は、作業ディレクトリのルートにあるため、相対パスとしてファイル名のみを使用することが有効です。
同様に、これがプロジェクト構造ProjectRoot\src\word.txt
である場合、パス"src/word.txt"
は有効です。
うまくいかない理由
1 つは、作業ディレクトリが常に変更される可能性があることです。たとえば、上記の例のようにコマンド ラインからコードを実行すると、作業ディレクトリはbin
. したがって、この場合は失敗します。bin\word.txt
次に、このプロジェクトを jar にエクスポートしようとしていて、ファイルが jar に含まれるように構成されていた場合、パスも無効になるため、失敗します。
そうは言っても、ファイルが埋め込みリソース(または単に「リソース」 - 私が時々同じ意味で使用する用語) であるかどうかを判断する必要があります。その場合は、ファイルをクラスパスに組み込み、URL 経由でアクセスする必要があります。(この特定のケースで)最初に行う必要があるのは、ファイルがクラスパスに組み込まれていることを確認することです。プロジェクト ルートにファイルがある場合は、ファイルを含めるようにビルドを構成する必要があります。ただし、ファイルをsrc
以下のディレクトリまたはディレクトリに配置すると、デフォルトのビルドはそれをクラスパスに配置する必要があります。
さまざまな方法でクラスパス リソースにアクセスできます。クラスパスリソースを取得するために使用するメソッドClass
を持つクラスを利用できます。getResourceXxx
たとえば、プロジェクト構造を に変更した場合、次のProjectRoot\src\resources\word.txt
ように使用できます。
InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
getResourceAsStream
を返しますがInputStream
、内部で URL を取得します。または、それが必要な場合に取得することもできURL
ます。getResource()
URLを返します
ディレクトリ構造が のような Maven ユーザーの場合src/main/resources
、フォルダーの内容はresources
クラスパスのルートに置かれます。したがって、そこにファイルがある場合は、使用するのはgetResourceAsStream("/thefile.txt")