2012-03-13 4 views
0

Я пытаюсь получить файл jrxml в относительном пути, используя следующий код Java:FileInputStream и FileNotFound Исключение

String jasperFileName = "/web/WEB-INF/reports/MemberOrderListReport.jrxml"; 
File report = new File(jasperFileName); 
FileInputStream fis = new FileInputStream(report); 

Однако, скорее всего, мне не удалось в определении относительного пути и получить Java .io.FileNotFoundException: ошибка во время выполнения.

Поскольку я не очень разбираюсь в операциях ввода/вывода Java, я не решил свою проблему. Любые помощь или идеи приветствуются.

+0

В каком контексте это происходит? В каком пакете/папке вы находитесь? – JMelnik

+0

Вы не можете обращаться к ресурсам таким образом. Вы не знаете, где именно этот файл будет расположен после развертывания веб-сервера. – Th0rndike

+0

Так что вы предлагаете? –

ответ

4

Вы пытаетесь обработать файл jrxml как объект в файловой системе, но это не применимо в веб-приложении.

Вы не знаете, как и где будет применяться ваше приложение, поэтому вы не можете указать на него File.

Вместо этого вы хотите использовать getResourceAsStream от ServletContext. Что-то вроде:

String resourceName = "/WEB-INF/reports/MemberOrderListReport.jrxml" 
InputStream is = getServletContext().getResourceAsStream(resourceName); 

- это то, что вам нужно.

+0

Дорогой Тим, С тех пор я не новичок. Не могли бы вы рассказать мне, какой класс импортировать для getServletContext() для вызова? Искренне ваш ... –

+0

Кстати, я пытаюсь реализовать в JSF :) –

+0

Я не эксперт JSF, извините. Но из того, что я могу сказать, вы хотите сделать «ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance(). GetExternalContext(). GetContext();' – Tim

0

проверьте, что ваш родственник базовый путь является то, что один вы думаете:

Файл F = новый файл («test.txt»); System.out.println (f.getAbsoluteFile());

2

Вы должны поместить 'MemberOrderListReport.jrxml' в путь к классам, например, он включен в jar, помещенный в web-inf \ lib или в виде файла в web-inf \ classes. вы можете прочитать файл, используя следующий код:

InputStream is=YourClass.class.getClassLoader().getResourceAsStream("MemberOrderListReport.jrxml"); 
+0

Дорогой Самарт, я не хочу читать файл, просто хочу получить. –

+0

Не знаете, как вы различаете чтение и извлечение. Чтобы получить, вы должны прочитать. getResourceAsStream возвращает InputStream, чего вы пытаетесь достичь. Обновленный ответ, чтобы отразить это. –

0

Я видел такого рода проблемы во много раз, и ответ всегда один и тот же ...

Проблема заключается в путь к файлу это не то, что вы думаете. Чтобы понять это, просто добавьте эту строку после создания File:

System.out.println(report.getAbsolutePath()); 

Посмотрите на выходе, и вы сразу увидите, что проблема есть.

+0

Уважаемый богемский, Спасибо за предложение. Я знаю проблему до подачи вопроса. Это связано с неправильным определением абсолютного пути отчета.Однако я хочу, чтобы он динамически генерировался при передаче файла на сервер, я не хочу определять абсолютный путь на сервере, а не относительный путь. Спасибо ... –

1
String jasperFileName = "/web/WEB-INF/reports/MemberOrderListReport.jrxml"; 

Простой. У вас нет файла /web/WEB-INF/reports/MemoberOrderListReport.jrxml на вашем компьютере.

Очевидно, что вы работаете в среде веб-приложений и ожидаете, что система автоматически решит это в контексте контейнера веб-приложения. Это не так. Вот что такое getRealPath() и друзья.

+0

, чтобы найти путь, должен ли я concat getRealPath() плюс jasperFileName ?? –

+0

@FarukPostacioglu смотреть Джавадок. Вы должны назвать это с именами файлов в качестве параметра. Вам также, вероятно, придется обрезать/веб. – EJP

Смежные вопросы