- PR -

相対PATHでのFile読み込み

1
投稿者投稿内容
eiji
常連さん
会議室デビュー日: 2003/07/23
投稿数: 32
投稿日時: 2005-03-11 19:12
java.io.File クラスの質問です。

相対PATHにてFileを読み込む為に、user.dir を設定しているのですが
うまくファイルを読み込む事が出来ません。
user.dir を指定してFileクラスを生成する場合はなにか
他の設定がいるのでしょうか?

試した事
1.user.dir を独自に指定せずに、もともとの実行ディレクトリ配下にファイルを置く
  読み込み可能
2.user.dir を独自に指定して、File.getAbsoluteFile() で絶対パスを取得
  正しく絶対PATHが表示されますが、ファイルは読み込めません。

ソース)
 user.dir は、サーバー側で設定

File f = new File("env/env.env");
System.out.println(f.exists()); // →これはFalseです。

File ff = new File(f.getAbsolutePath());
System.out.println(ff.exists() ); // →これはTrueです。

環境:
 WinXP、WAS Studio Site Developer 5.1.2


 
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-03-11 20:00
WinXPなら区切り文字は\\ではないでしょうか?
(Windows上じゃなかったらすみません)
eiji
常連さん
会議室デビュー日: 2003/07/23
投稿数: 32
投稿日時: 2005-03-11 20:40
返信ありがとうございます。
\\に変更しても、読み込めませんでした。

今回の疑問点は、

File f = new File("env/env.env");
 で、f.exists() はFalseなのに、
読み込めないファイルの絶対パスで、Fileクラスを生成しなおすと
読み込めるのが理解できません。

File ff = new File(f.getAbsolutePath());
 で、ff.exists()  は、True

ヒントでも頂ければと思っています。

[ メッセージ編集済み 編集者: eiji 編集日時 2005-03-11 20:44 ]

[ メッセージ編集済み 編集者: eiji 編集日時 2005-03-13 14:23 ]
eiji
常連さん
会議室デビュー日: 2003/07/23
投稿数: 32
投稿日時: 2005-03-13 15:33
user.dir を、システムプロパティの設定で、変更しても
JavaVMは既に起動されているわけで、実際のVM実行ディレクトリは
変更されない。
f.getAbsolutePath()では、一応 user.dir + "env/env.env"
で絶対PATHを取得できるが、f.exists()で参照するファイルは、
本来のカレント+"env/env.env" を参照している。

user.dir は、読取り専用で、カレントを変更したい場合は
native interfaceでするしかない。

認識はあってますでしょうか?
#f.getAbsolutePath() が、本来のカレント+"env/env.env"で表示されれば
疑問はないのですが。。。
未記入
会議室デビュー日: 2005/03/03
投稿数: 9
投稿日時: 2005-03-14 08:57
File読み込みの場合の注意点というか、わかりきっていることとは思いますが…。

1.指定されている場所にファイルは存在しているか?
2.PATHの指定は正しいか?
どちらも意味合いは一緒ですね

たとえば読み込むファイルがC:\x1\xxx.*だったとして、classファイルがC:\x2\xxx.classなのにPATHの指定はxxx.*で指定されてるとか…ないですよね。

単純な回答で申し訳ありません。
私がやっていたときはこのミスが一番多かったので…。

[ メッセージ編集済み 編集者: はど 編集日時 2005-03-14 08:58 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-03-14 11:42
引用:
File読み込みの場合の注意点というか、わかりきっていることとは思いますが…。


元質問者の投稿をちゃんと読んだほうがいいですよ。あなたの言ってることは、まったくもって的外れですから。

とりあえず、user.dir を使って相対パス解決する API とそうでない API が混在しているので、実行時に user.dir を変更すると混乱する原因になる。user.dir は VM を起動したカレントディレクトリを格納している参照専用プロパティとして扱ったほうが安全。

Java でシステム依存の API が利用するカレントディレクトリを変更するには JNI を使用する必要がある。ただ、今回の内容なら、十分に注意を払った上で user.dir を利用して File.getAbsoluteFile().exists() などを利用するのも手かと。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-03-14 12:41
サーバサイドでuser.dirのようなプロパティを当てにしたコーディングをするのはやめたほう
がいいでしょう。特定のディレクトリ以下のファイルを扱いたいのであれば、そのディレクトリ
を指すプロパティを新規に作り、そのディレクトリ以下にファイルパスを設定するようにした
方がよいでしょう。
1

スキルアップ/キャリアアップ(JOB@IT)