質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • Java

    16225questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Java(Webアプリケーション)でのファイルパスの指定方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,711

tayack122

score 9

eclipseにてwebアプリケーションを作っております。
プロジェクト内に記述されているファイルを読み込みたく下記のようなコードを記述したのですが、filenotfoundexceptionが発生します。
イメージ説明

相対位置指定のパスの場合は、プロジェクトフォルダから始まるという事だったので記述方法は正しいと思うのですが。。。
(ファイルの場所:src\csvData\tbl_user.csv)

エクセプションを発生させずにファイルを読み込むにはどうしたら良いでしょうか?
String separator=File.separator;
は読み込んでいる。

イメージ説明
エクセプションの画面

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

File.pathSeparatorでなく、File.separatorを使ってください。
File.pathSeparatorには、クラスパスなどの環境変数の区切りに使う、";"や":"などが格納されています。

Java8のJavaDocを見ると、
pathSeparator、separatorの説明は詳細が書かれていないのですが、

pathSeparatorCharの説明として、

システムに依存するパス区切り文字です。このフィールドは、システム・プロパティpath.separatorの値の最初の文字を格納するように初期化されます。この文字は、パス・リストとして渡されるファイルのシーケンス中のファイル名を区切るために使用されます。UNIXシステムの場合、この区切り文字は':'です。Microsoft Windowsシステムでは';'です

separatorCharの説明として、

システムに依存するデフォルトの名前区切り文字です。このフィールドは、システム・プロパティfile.separatorの値の最初の文字を格納するように初期化されます。UNIXシステムの場合、このフィールドの値は'/'、Microsoft Windowsシステムの場合は'\\'です。

とあり、要するにあるパスの内部を区切る文字がseparatorで、  
複数のパス同士を区切る文字がpathSeparatorです。


(2016/01/07 13:42修正)
FileReaderを使うのであれば、以下のようにすれば読み込めそうです。
Apache Tomcat/8.0.26で確認しました。
注意点としては、これらの方法を使うのであれば、File.separatorでなく"/"を使う必要があります。

new FileReader(request.getServletContext().getRealPath("/WEB-INF/classes/csvData/tbl_user.csv"))


(requestは、HttpServletRequestです。)

ただ、Tomcat以外で、ファイルとして展開されない場合もあるので、
以下の方法のほうが良いかもしれません。

new InputStreamReader(this.getClass().getResourceAsStream("/csvData/tbl_user.csv"))

(2016/1/7 13:52追記)
使用したAPIのJavaDocを引用しておきます。
javax.servlet.ServletContext#getRealPath

与えられた仮想パスに対応する実際のパスを String オブジェクトで返します。 例えば、"/index.html" というパスが与えられたとするとサーバのファイルシステム上の絶対パスを返します。 そのパスは "http://host/contextPath/index.html" がリクエストされたときに提供するファイルのパスです。 ここで、contextPath というのはこの ServletContext のコンテキストパスを意味しています。

これはそのまま分かるかと思います。

java.lang.Class#getResourceAsStream

指定された名前のリソースを探します。指定されたクラスに関連したリソースを検索するルールは、クラスのクラス・ローダーを定義して実装されます。このメソッドは、このオブジェクトのクラス・ローダーに委譲されます。

記述はちょっと分かりにくいですが、
クラスパスに含めたファイルから内容を読み込む方法と思えばよいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/07 12:56 編集

    ご回答ありがとうございます。
    変更したのですが、やはりエクセプションが発生します。

    pathSeparatorCharは環境変数PATHなどを変更する時に使うモノなのですね。
    ご丁寧にありがとうございます。

    キャンセル

  • 2016/01/07 13:04

    (ファイルの場所:src\csvFile\tbl_user.csv)
    とありますが、画像では
    csvDataになっていますがこれはどちらが正しいですか?

    キャンセル

  • 2016/01/07 13:10

    src\csvData\tbl_user.csv(画像)が正しいです。

    キャンセル

  • 2016/01/07 13:14

    おっと、webアプリケーションですね。
    webアプリケーションだと相対パス指定は使えません。
    この後回答を修正します。

    キャンセル

  • 2016/01/07 13:40

    ありがとうございます。助かります。

    キャンセル

  • 2016/01/07 13:50

    回答に追記しました。
    そういえば、どうしてもFileReaderを使いたければ、
    new FileReader(request.getServletContext().getRealPath("/") + separator + "WEB-INF" + separator + "classes" + separator + "csvData" + separator + "tbl_user.csv")
    でも読み込みは可能と思います。

    キャンセル

  • 2016/01/07 14:00

    おかげさまで解決できました。
    ありがとうございました。

    キャンセル

0

エラーの原因は、どのように実行しているかにもよります。
Eclipseの実行→Javaアプリケーションで実行していますか? それ以外ですか?

それとは別に、ファイルパスを扱う場合、直接File.separatorを使うより、
Fileクラスを使った方が確実だと思います。

File dir = new File("src", "csvData");
File csvFile = new File(dir, "tbl_user.csv");
FileReader fr = new FileReader(csvFile);

それと、絶対に大丈夫とは言いませんが、Javaでは、Windowsの場合でも/で区切っても動作します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/07 13:28

    ご回答ありがとうございます。
    右クリック→サーバーでデバッグで実行しております。

    確かに文字列結合よりFileクラスを用いた方が安全そうですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16225questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。