web-dev-qa-db-ja.com

Java InputStreamからファイルの絶対パスを取得するには?

私は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がクラスパスで見つかった場合、ファイルシステム上のファイルの場所への絶対パスが含まれておらず、おそらくそれがリーダーコードが探しているもの。

14
user1768830

与えられた例から、fileNameが何を指しているのかは明確ではありません。 getResourceAsStream()から取得したストリームを使用して、ファイルを読み取ります。

reader = new BufferedReader(new InputStreamReader(istream));

また、読み取りサイクルごとにbuf newを繰り返し割り当てることは避けてください。1回で十分です。

2
Gyro Gearless

クラスローダーからリソースを使用します。

代わりに:

_InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
_

行う:

_URL url = getClass().getResource("config.xml");
_

そのURLにはパスがあります(.toURI().getPath()を使用)。一致する入力ストリームを後で開くには、.openStream()を使用します。

少なくともリソースが存在することを知っています。存在しない場合、.getResource{,AsStream}()は両方ともnullを返します(IOExceptionをスローする代わりに、疑わしい私見です)。

32
fge