Пути FileOutputStream в веб-приложении java/jsp

У меня есть простое веб-приложение Java со следующей структурой папок.

введите здесь описание изображения

Когда я развертываю веб-приложение, у него есть файл data.json в папке WEB-INF/classes. Мне нужно записать данные в этот файл из пакета контроллера класса controller.java, который находится в папке WEB-INF/classes.

Я пробовал следующий код.

FileOutputStream output = new FileOutputStream("..\\data.json", true);
output.write(jsonObject.toJSONString().getBytes());
output.flush();

Это не дает мне никаких ошибок, которые предполагают, что операция происходит в файле где-то на моем компьютере.

Как мне написать в файл data.json? Я не могу указать здесь абсолютный путь.


person Chamila Wijayarathna    schedule 23.12.2016    source источник
comment
Взгляните на этот пост, который может вам помочь: stackoverflow.com/questions/4340653/   -  person JHDev    schedule 23.12.2016


Ответы (2)


WEB-INF/classes предназначен для пути к классам. Файлы там следует рассматривать как доступные только для чтения кэшируемые ресурсы (getResource, getResourceAsStream).

HttpRequest.getServletContext().getRealPath("/WEB-INF") можно использовать для путей файловой системы.

Я предлагаю использовать файлы классов в качестве шаблона, скопированные в первый раз в реальный путь файловой системы, а затем перезаписанные.

Используйте /, а не Windows \\.

Используйте close() и тогда flush() не нужно.

Используйте getBytes(StandardCharsets.UTF_8).

person Joop Eggen    schedule 23.12.2016
comment
Можно ли поместить файл data.json в папку WEB-INF вне папки классов? - person Chamila Wijayarathna; 23.12.2016
comment
вне WEB-INF он будет напрямую доступен для внешнего мира. любой запрос к /yourapp/data.json будет обслуживать этот файл, если вы явно не защитите его. - person Balaji Krishnan; 23.12.2016
comment
Что такое HTTPRequest здесь? Как я могу получить это. Я мог бы передать объект HttpServletRequest из jsp в файл java, но он не содержит метода getServeletContext(). - person Chamila Wijayarathna; 23.12.2016
comment
Да, это то, что я имел в виду - person Joop Eggen; 24.12.2016

Следующий код работал,

FileOutputStream output = new FileOutputStream( request.getSession().getServletContext().getRealPath("WEB-INF/classes/data.json"), false);
person Chamila Wijayarathna    schedule 23.12.2016