16

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

4

2 に答える 2

39

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

代わりに:

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

行う:

URL url = getClass().getResource("config.xml");

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

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

于 2013-06-26T20:39:10.730 に答える
2

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

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

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

于 2013-06-26T21:14:04.607 に答える