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