2017-02-20 17 views
0

"levels"というフォルダにあるtxtファイルを読み込もうとしています。 Scannerを使用しているクラスはsrc/anotherPackageNameです(該当する場合)。実行時:プロジェクトとは別のフォルダからファイルを読み取る方法

Scanner s = new Scanner(new File("levels/level0")); //adding .txt doesn't fix 

例外をスローします。私は、絶対パスを使用するのではなく、可能であればプロジェクトとの相対的な使い方を望んでいます。これは私のフォルダ構造です:

D:\OneDrive\Folder\AnotherFolder\ProjectName 

ProjectName 
    src 
     packageOne 
      ClassWhereImUsingScanner 
      OtherClasses 
     (...) 
    levels 
     level0 
     level1 
     (...) 

答えて

1

通常のパスは、あなたの実行に関連しているが、それはまた、日食のプロジェクトの設定に依存し、あなたのディレクトリ構造に関するより多くの情報を送ることができますか?このような何かしてみてください、あなた構造に基づいて

:ほとんどのJavaコードで、プロジェクトの終了状態は、IDEから実行されていないことではなく、いくつかの生産システムから、

Scanner s = new Scanner(new File("../levels/level0")); 
1

ベア心​​の中に(たとえば、アプリまたはサーバー)。その場合、開発ソースコード構造は利用できません。

テキストファイルやその他のリソースをJavaで読むには、主に2つの方法があります。実際のファイルへのパスを見つけることができます。その場合は、開発ソースツリーが不足している可能性があります。テキストファイルをプロジェクトにバンドルする方法を見つける必要があります。

ほとんどのJavaプロジェクトは、JARファイルまたはWARファイル(Webアプリケーション用)またはAndroid APKなどのアーカイブにコンパイルされてしまいます。ほとんどの場合、独自のテキストファイルをプロジェクトアーカイブに追加できます。たとえば、Mavenプロジェクトでは、テキストファイルをsrc/main/resourcesフォルダに置くだけであれば、コンパイル済みのJARファイルに含める必要があります。

ただし、この場合、テキストファイルは別のファイルではなくなりましたディスクではなく、アーカイブ内のデータの塊である。アーカイブを解凍して実際のFileオブジェクトを取得することはできますが、実際に必要なのはバイトを読み取るだけで済む場合は無駄です。

このように、このようなテキストファイルを読み取る最も一般的な方法は、.classファイルをディスクから(またはアーカイブから、またはネットワーク経由で)何かを読み取っている既存のClassLoaderメカニズムを使用することです。 ClassLoaderは既にコンパイルされたコードの "横に"あるバイトをロードする方法を知っているので、それを利用することができます。あなたのケースでは

、あなたはこのような何かを行うことができるようになります。この場合

Scanner scanner = new Scanner(
    getClass().getResourceAsStream("/path/to/file.txt")); 

は、/path/to/file.txtパスはあなたのクラスがからロードされたパスからの相対です。例えば。クラス名がmy.package.Fooの場合、実際のクラスバイトはmy/package/Foo.classという名前のフォルダ(ファイルシステムフォルダまたはJARファイルなど)に格納されます。この場合、path/to/file.txtmy/package/Foo.classは同じルートからの相対パスになります。

詳細については、the documentation on resourcesを参照してください。あなたはこのような何かを行うことができ、ファイルにアクセスするためにそう

関連する問題