Java resource file spring

Write a file to resources folder in Spring

I want to know, how to write a file to a resources folder in a Spring MVC project. I defined the resources path in a web-dispatcher-servlet.xml as
I read examples about how to read a file from a resources folder. But I want to write a file to a resources folder. I tried

ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("file/test.xml").getFile()); if (file.createNewFile()) < System.out.println("File is created!"); >else

3 Answers 3

If you want to create a test.xml file in the directory returned by getResource() , try this:

File file = new File(classLoader.getResource(".").getFile() + "/test.xml"); if (file.createNewFile()) < System.out.println("File is created!"); >else

Calling getFile() on a non-existent directory or file will return null, as explained in Reid’s answer.

It looks like your call to getResource(«file/test.xml») is likely returning null.

I’m curious, what is the full path to your XML file? For this to work, the resources directory needs to be placed in your webapp directory. If you are trying to use the standard Java resources structure (src/main/resources) then that Spring MVC mapping will not work.

EDIT: After seeing your answer to @Ascalonian’s comment, this will not work since the file doesn’t exist. Like I mentioned earlier, getResource(«file/test.xml») will return null so the following call to getFile() will throw the NPE. Maybe you should check if getResource returns null and use that as an indication that the file needs to be created.

Читайте также:  Calendar

Источник

Урок 3: Работа с ресурсами

Этот урок освещает работу с ресурсами и основан на оригинальной документации §6. Resources.

Что вам потребуется

Настройка проекта

Прежде чем вы начнете изучать этот урок, вам необходимо создать класс lessons.starter.ResourceStarter .

Введение

Стандартный Java-класс java.net.URL и стандартные обработчки различных URL префиксов к сожалению не во всём достаточно пригодны для доступа к низкоуровневым ресурсам. К примеру, нет стандартизированных реализаций URL , которые могут быть использованы для доступа к ресурсам, которые необходимо получить из classpath, либо ServletContext . Можно зарегистрировать новые обработчики для конкретных URL префиксов, но это довольно сложная задача, а интерфейс URL все ещё недостаточно функционален.

Spring предоставляет интерфейс Resource , более совместимый для низкоуровнего доступа.

public interface Resource extends InputStreamSource < boolean exists(); boolean isOpen(); URL getURL() throws IOException; File getFile() throws IOException; Resource createRelative(String relativePath) throws IOException; String getFilename(); String getDescription(); //. >
public interface InputStreamSource

Интерфейс Resource используется и в самом Spring в качестве типа аргументов во многих методах, где необходимы ресурсы. Другие методы принимают в качестве аргументов строковые значения, которые в конечном счете используются для получения ресурсов. Важно понимать, что реализации интерфейса Resource не заменяют функциональность, а являются «оберткой». Например, URLResource является «оберткой» для URL .

Встроенные реализации

Из реализаций интерфейса Resource , которые входят в состав Spring, стоит выделить следующие:

  • UrlResource — является оберткой для java.net.URL и может быть использован для доступа к любому объекту по его URL, например, файлы, HTTP или FTP ресурс и др., либо через строковое представление с соответветствующими префиксами classpath: , file: , http: , ftp: и др.
  • ClassPathResource — представляет ресурс, который может быть получен из classpath и поддерживает ресурсы как java.io.File , если они расположены в файловой системе, а не в jar
  • FileSystemResource — реализация для обработки java.io.File . Поддерживает как File , так и URL
  • ServletContextResource — реализация для обработки ServletContext ресурсов относительно корневой директории web-приложения. Поддерживает потоковый и к URL доступ. Доступ к java.io.File возможен, когда web-приложение развернуто и ресурс физически находится в файловой системе
  • InputStreamResource — реализация для обработки InputStream . Должен использоваться только тогда, когда нет доступных соответствующих реализаций интерфейса Resource или нет возможности использовать более предпочтительный вариант ByteArrayResource
  • ByteArrayResource — реализация для обработки массива байтов. Полезен для загрузки контента из любого массива байтов, не прибегая к использованию InputStreamResource

Получение ресурсов

ResourceLoader

Интерфейс ResourceLoader предназначен для реализации возврата, т.е. загрузки, экземпляров Resource .

public interface ResourceLoader

Все контексты приложения реализуют данный интерфейс. Когда вы вызываете метод getResource() в определенном контексте приложения без указания префикса, то вы получите тот тип Resource , который соответствует контексту. В качестве демонстрации, можно запустить метод src/main/java/lessons/starter/ResourceStarter#printClassResourcesByContextNoPrefix() . В методе src/main/java/lessons/starter/ResourceStarter#printClassResourcesByContextWithPrefix() на консоль отбражаются подобные результаты, но ресурс передается уже с префиксом.

public class ResourceStarter < public static final Logger LOGGER = LogManager.getLogger(ResourceStarter.class); public static void main(String[] args) throws IOException < LOGGER.info("Starting resources. "); ResourceStarter starter = new ResourceStarter(); starter.printClassResourcesByContextNoPrefix(); starter.printClassResourcesByContextWithPrefix(); >public void printClassResourcesByContextNoPrefix() < LOGGER.info("*******printClassResourcesByContextNoPrefix**********"); ApplicationContext context = new AnnotationConfigApplicationContext(); Resource resource = context.getResource("resources/log4j.properties"); LOGGER.info("AnnotationConfigApplicationContext: " + resource.getClass().getSimpleName()); context = new ClassPathXmlApplicationContext(); resource = context.getResource("resources/log4j.properties"); LOGGER.info("ClassPathXmlApplicationContext: " + resource.getClass().getSimpleName()); context = new FileSystemXmlApplicationContext(); resource = context.getResource("resources/log4j.properties"); LOGGER.info("FileSystemXmlApplicationContext: " + resource.getClass().getSimpleName()); LOGGER.info("****************************************************"); >public void printClassResourcesByContextWithPrefix() < LOGGER.info("*******printClassResourcesByContextWithPrefix*******"); ApplicationContext context = new AnnotationConfigApplicationContext(); Resource resource = context.getResource("file:resources/log4j.properties"); LOGGER.info("file: " + resource.getClass().getSimpleName()); resource = context.getResource("http://spring.io/img/favicon.png"); LOGGER.info("http: " + resource.getClass().getSimpleName()); resource = context.getResource("classpath:resources/log4j.properties"); LOGGER.info("classpath: " + resource.getClass().getSimpleName()); LOGGER.info("****************************************************"); >>

ResourceLoaderAware

Интерфейс ResourceLoaderAware обеспечивает объект ссылкой на ResourceLoader .

public interface ResourceLoaderAware

Если класс реализует интерфейс ResourceLoaderAware и развернут в контексте приложения, например, как бин, то при его сборке контекст приложения будет вызывать метод setResourceLoader() и передавать соответствующий ResourceLoader , в зависимости от типа контекста.

Получение ресурса по его пути

Если ваш контекст ClassPathXmlApplicationContext , то вы можете получить ресурс по его пути с указанием префикса classpath: или без него с учетом его местоположения в classpath. Если же вам необходимо получить ресурс по его полному пути, то вам необходимо указать префикс file: , либо ваш контекст должен быть типа FileSystemXmlApplicationContext . В качестве демонстрации, можно запустить метод src/main/java/lessons/starter/ResourceStarter#resourcePath() .

public class ResourceStarter < public static final Logger LOGGER = LogManager.getLogger(ResourceStarter.class); public static void main(String[] args) throws IOException < //. starter.resourcePath(); >public void resourcePath() throws IOException < LOGGER.info("*****************resourcePath()*********************"); LOGGER.info("context = new ClassPathXmlApplicationContext()"); ApplicationContext context = new ClassPathXmlApplicationContext(); Resource resource = context.getResource("log4j.properties"); LOGGER.info("log4j.properties exist: " + resource.getFile().exists()); // resource = context.getResource("src/main/resources/log4j.properties"); // LOGGER.info("log4j.properties exist: " + resource.getFile().exists()); //IOException resource = context.getResource("file:src/main/resources/log4j.properties"); LOGGER.info("file:src/main/resources/log4j.properties exist: " + resource.getFile().exists()); resource = context.getResource("log/log.txt"); LOGGER.info("log/log.txt exist: " + resource.getFile().exists()); resource = context.getResource("classpath:log/log.txt"); LOGGER.info("classpath:log/log.txt exist: " + resource.getFile().exists()); resource = context.getResource("file:log.txt"); LOGGER.info("file:log.txt exist: " + resource.getFile().exists()); resource = context.getResource("file:log/log.txt"); LOGGER.info("file:log/log.txt exist: " + resource.getFile().exists()); resource = context.getResource("file:src/main/resources/log/log.txt"); LOGGER.info("file:src/main/resources/log/log.txt exist: " + resource.getFile().exists()); LOGGER.info("context = new FileSystemXmlApplicationContext()"); context = new FileSystemXmlApplicationContext(); resource = context.getResource("log4j.properties"); LOGGER.info("log4j.properties exist: " + resource.getFile().exists()); resource = context.getResource("src/main/resources/log4j.properties"); LOGGER.info("src/main/resources/log4j.properties exist: " + resource.getFile().exists()); resource = context.getResource("log/log.txt"); LOGGER.info("log/log.txt exist: " + resource.getFile().exists()); resource = context.getResource("classpath:log/log.txt"); LOGGER.info("classpath:log/log.txt exist: " + resource.getFile().exists()); resource = context.getResource("file:log.txt"); LOGGER.info("file:log.txt exist: " + resource.getFile().exists()); resource = context.getResource("file:log/log.txt"); LOGGER.info("file:log/log.txt exist: " + resource.getFile().exists()); LOGGER.info("****************************************************"); >>

Итог

Несмотря на небольшой объем урока, вы познакомились с основами доступа к ресурсам встроенными в Spring средствами. В соответствии с тем, что уроки не предусматривают работу с XML-конфигурациями, а только c Java-конфигурациями, не были рассмотрены варианты указания различных шаблонов в конструктор XML-конфигурациии, но вам ничто не мешает при необходимости ознакомиться с соответствующими разделами документации.

Источник

Class FileSystemResource

Resource implementation for java.io.File and java.nio.file.Path handles with a file system target. Supports resolution as a File and also as a URL . Implements the extended WritableResource interface.

Note: As of Spring Framework 5.0, this Resource implementation uses NIO.2 API for read/write interactions. As of 5.1, it may be constructed with a Path handle in which case it will perform all file system interactions via NIO.2, only resorting to File on getFile() .

Constructor Summary

Create a new FileSystemResource from a Path handle, performing all file system interactions via NIO.2 instead of File .

Method Summary

This implementation creates a FileSystemResource, applying the given path relative to the path of the underlying file of this resource descriptor.

This implementation checks whether the underlying file is marked as readable (and corresponds to an actual file with content, not to a directory).

This implementation checks whether the underlying file is marked as writable (and corresponds to an actual file with content, not to a directory).

Methods inherited from class org.springframework.core.io.AbstractResource

Methods inherited from class java.lang.Object

Methods inherited from interface org.springframework.core.io.Resource

Constructor Details

FileSystemResource

Create a new FileSystemResource from a file path. Note: When building relative resources via createRelative(java.lang.String) , it makes a difference whether the specified resource base path here ends with a slash or not. In the case of «C:/dir1/», relative paths will be built underneath that root: e.g. relative path «dir2» → «C:/dir1/dir2». In the case of «C:/dir1», relative paths will apply at the same directory level: relative path «dir2» → «C:/dir2».

FileSystemResource

Create a new FileSystemResource from a File handle. Note: When building relative resources via createRelative(java.lang.String) , the relative path will apply at the same directory level: e.g. new File(«C:/dir1»), relative path «dir2» → «C:/dir2»! If you prefer to have relative paths built underneath the given root directory, use the constructor with a file path to append a trailing slash to the root path: «C:/dir1/», which indicates this directory as root for all relative paths.

FileSystemResource

Create a new FileSystemResource from a Path handle, performing all file system interactions via NIO.2 instead of File . In contrast to PathResource , this variant strictly follows the general FileSystemResource conventions, in particular in terms of path cleaning and createRelative(String) handling. Note: When building relative resources via createRelative(java.lang.String) , the relative path will apply at the same directory level: e.g. Paths.get(«C:/dir1»), relative path «dir2» → «C:/dir2»! If you prefer to have relative paths built underneath the given root directory, use the constructor with a file path to append a trailing slash to the root path: «C:/dir1/», which indicates this directory as root for all relative paths. Alternatively, consider using PathResource(Path) for java.nio.path.Path resolution in createRelative , always nesting relative paths.

FileSystemResource

Create a new FileSystemResource from a FileSystem handle, locating the specified path. This is an alternative to FileSystemResource(String) , performing all file system interactions via NIO.2 instead of File .

Источник

Оцените статью