Как получить абсолютный путь к файлу 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

поэтому сканирование classpath для config.xml успешно, но тогда читатель не могу найти файл. почему??? единственная моя теория заключается в том, что когда config.xml находится на пути к классу, он не содержит абсолютный путь к местоположению файла в файловой системе, и возможно, что код читатель ищет.

2 ответов


из вашего примера не понятно, что fileName относится. Вы должны просто использовать поток, который вы получили от getResourceAsStream()читать вам файл, что-то вместе

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

и вы должны избегать многократного выделения buf new для каждого цикла чтения, один раз достаточно.


вы используете ресурс от classloader.

вместо:

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

do:

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

этот URL-адрес будет иметь путь (использовать .toURI().getPath()). Чтобы впоследствии открыть соответствующий входной поток, используйте .openStream().

вы знаете, по крайней мере, что ресурс существует: если это не так,.getResource{,AsStream}() как вернуть null (вместо того, чтобы бросать IOException, что сомнительно imho)