eclipseにてwebアプリケーションを作っております。
プロジェクト内に記述されているファイルを読み込みたく下記のようなコードを記述したのですが、filenotfoundexceptionが発生します。
相対位置指定のパスの場合は、プロジェクトフォルダから始まるという事だったので記述方法は正しいと思うのですが。。。
(ファイルの場所:src\csvData\tbl_user.csv)
エクセプションを発生させずにファイルを読み込むにはどうしたら良いでしょうか?
String separator=File.separator;
は読み込んでいる。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
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
でなく"/"
を使う必要があります。
lang
1new FileReader(request.getServletContext().getRealPath("/WEB-INF/classes/csvData/tbl_user.csv"))
(requestは、HttpServletRequestです。)
ただ、Tomcat以外で、ファイルとして展開されない場合もあるので、
以下の方法のほうが良いかもしれません。
lang
1new 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 03:43
編集2016/01/07 05:02総合スコア1546
0
エラーの原因は、どのように実行しているかにもよります。
Eclipseの実行→Javaアプリケーションで実行していますか? それ以外ですか?
それとは別に、ファイルパスを扱う場合、直接File.separator
を使うより、
File
クラスを使った方が確実だと思います。
lang
1File dir = new File("src", "csvData"); 2File csvFile = new File(dir, "tbl_user.csv"); 3FileReader fr = new FileReader(csvFile);
それと、絶対に大丈夫とは言いませんが、Javaでは、Windowsの場合でも/
で区切っても動作します。
投稿2016/01/07 04:16
総合スコア9390
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/07 04:00 編集
2016/01/07 04:04
2016/01/07 04:10
2016/01/07 04:14
2016/01/07 04:40
2016/01/07 04:50
2016/01/07 05:00