私はJava 6であり、config.xml
というファイルのランタイムクラスパスをスキャンするメソッドがあります。見つかった場合、ファイルの内容をストリング:
InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
if(istream != null) {
System.out.println("Found config.xml!");
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(fileName));
char[] buf = new char[1024];
int numRead = 0;
while((numRead=reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
reader.close();
}
} catch (FileNotFoundException fnfExc) {
throw new RuntimeException("FileNotFoundException: " + fnfExc.getMessage());
} catch (IOException ioExc) {
throw new RuntimeException("IOException: " + ioExc.getMessage());
}
}
このコードを実行すると、次のコンソール出力が表示されます。
Found config.xml!
Exception in thread "main" Java.lang.RuntimeException: FileNotFoundException: config.xml (No such file or directory)
at com.me.myapp.Configurator.readConfigFileFromClasspath(Configurator.Java:556)
at com.me.myapp.Configurator.<init>(Configurator.Java:34)
...rest of stack trace omitted for brevity
したがって、config.xml
のクラスパススキャンは成功しますが、リーダーはファイルを見つけられないようです。 なぜ???私の唯一の理論は、config.xml
がクラスパスで見つかった場合、ファイルシステム上のファイルの場所への絶対パスが含まれておらず、おそらくそれがリーダーコードが探しているもの。
与えられた例から、fileName
が何を指しているのかは明確ではありません。 getResourceAsStream()
から取得したストリームを使用して、ファイルを読み取ります。
reader = new BufferedReader(new InputStreamReader(istream));
また、読み取りサイクルごとにbuf
newを繰り返し割り当てることは避けてください。1回で十分です。
クラスローダーからリソースを使用します。
代わりに:
_InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
_
行う:
_URL url = getClass().getResource("config.xml");
_
そのURLにはパスがあります(.toURI().getPath()
を使用)。一致する入力ストリームを後で開くには、.openStream()
を使用します。
少なくともリソースが存在することを知っています。存在しない場合、.getResource{,AsStream}()
は両方ともnull
を返します(IOExceptionをスローする代わりに、疑わしい私見です)。