[Рекомендуемая коллекция] 8 способов чтения данных файла *.properties

Java

предисловие

В настоящее время внешняя конфигурация используется в большинстве архитектурных проектов, потому что от разработки, тестирования, предварительного выпуска до производства разные среды имеют разные конфигурации, и невозможно каждый раз менять код для изменения конфигурации. Таким образом, внешняя конфигурация уже является незаменимым дизайном. В настоящее время типы файлов для хранения конфигурации также включают yaml, properties и т. д. Сегодня я расскажу о n методах Java для чтения данных файла свойств.

Чтение файлов *.properties в основном делится на два этапа:

  1. найти путь к ресурсу
  2. ресурс загрузки

В соответствии с различными методами поиска путей к ресурсам и различными методами загрузки данных о ресурсах методы в основном делятся на следующие 8 типов:

1. Прочитайте файл конфигурации на основе метода getResourceAsStream класса ClassLoder.

2. Прочитайте файл конфигурации на основе метода getResourceAsStream().

3. Прочитайте файл конфигурации на основе статического метода getSystemResourceAsStream() класса ClassLoader.

4. Чтение файлов конфигурации на основе FileInputStream

5. Чтение файлов конфигурации на основе ResourceBundle

6. Чтение файлов конфигурации на основе PropertyResourceBundle

7. Чтение конфигурации на основе xml

8. Чтение конфигурации на основе аннотаций

Позвольте мне объяснить их один за другим.Во-первых, я создал config.properties в разделе ресурсов, который содержит только одну конфигурацию, name=crazyhzm. Все следующие примеры имитируют чтение атрибута имени в файле.

1. Прочитайте файл конфигурации на основе метода getResourceAsStream класса ClassLoder.

Этот метод основан на методе getResourceAsStream ClassLoder, находит ресурс через загрузчик классов, возвращает InputStream и загружает его с объектом Properties.

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream in = Test.class.getClassLoader().getResourceAsStream("config.properties");
        Properties properties = new Properties();
        properties.load(in);
        System.out.println(properties.getProperty("name"));
    }
}

2. Прочитайте файл конфигурации на основе метода getResourceAsStream().

Этот метод использует метод класса getResourceAsStream для поиска файла ресурсов и напрямую возвращает объект InputStream, а затем загружает его через свойства.

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream in = Test.class.getResourceAsStream("config.properties");
        Properties properties = new Properties();
        properties.load(in);
        System.out.println(properties.getProperty("name"));
    }
}

3. Прочитайте файл конфигурации на основе статического метода getSystemResourceAsStream() класса ClassLoader.

Этот метод использует статический метод getSystemResourceAsStream() ClassLoader для поиска ресурсов, возвращает InputStream и, наконец, использует свойства для загрузки. На самом деле, ClassLoader.getSystemResourceAsStream также вызывается в getResourceAsStream предыдущего метода, давайте взглянем на исходный код:

 public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
}

Пример этого метода:

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream in = ClassLoader.getSystemResourceAsStream("config.properties");
        Properties properties = new Properties();
        properties.load(in);
        System.out.println(properties.getProperty("name"));
    }
}

4. Чтение файлов конфигурации на основе FileInputStream

Этот метод находит путь к ресурсу файла свойств через путь к классу, затем считывает поток через FileInputStream и, наконец, загружает данные с помощью метода load() класса java.util.Properties.

public class Test {
    public static void main(String[] args) throws IOException {
        URL url = Test.class.getClassLoader().getResource("config.properties");
        if (url != null) {
            String fileName = url.getFile();
            InputStream in = new BufferedInputStream(new FileInputStream(fileName));
            Properties properties = new Properties();
            properties.load(in);
            System.out.println(properties.getProperty("name"));
        }
    }
}

5. Чтение файлов конфигурации на основе ResourceBundle

ResourceBundle на самом деле используется для решения проблемы интернационализации и локализации, но если вам нужно переключаться между несколькими языками, должен быть файл конфигурации для указания содержимого переключателя, например, вам нужно преобразовать клик в клик. Необходимо сопоставить эти два значения в конфигурационном файле.Я не буду их повторять здесь.Это мало связано с этой статьей.При чтении конфигурационного файла также является решением использовать ResourceBundle для чтения свойств файл.

Затем, чтобы использовать ResourceBundle, я добавил новый файл конфигурации с именем config_en_US.properties, содержание такое же, как и у config.properties, вы обнаружите, что после создания имя папки Resource немного изменилось. .

Вот пример использования:

public class Test {
    public static void main(String[] args) throws IOException {
        Locale locale1 = new Locale("en", "US");
        ResourceBundle resourceBundle = ResourceBundle.getBundle("config", locale1);
        System.out.println(resourceBundle.getString("name"));

    }
}

6. Чтение файлов конфигурации на основе PropertyResourceBundle

PropertyResourceBundle является подклассом ResourceBundle, и мы также можем использовать PropertyResourceBundle для загрузки данных файла конфигурации. Конкретный пример выглядит следующим образом:

public class Test {
    public static void main(String[] args) throws IOException {
        URL url = Test.class.getClassLoader().getResource("config.properties");
        if (url != null) {
            InputStream in = new BufferedInputStream(new FileInputStream(url.getFile()));
            ResourceBundle resourceBundle = new PropertyResourceBundle(in);
            System.out.println(resourceBundle.getString("name"));
        }
    }
}

7. Чтение конфигурации на основе xml

  1. Добавьте зависимость spring-context:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>
  1. Создать пользовательский сервис
@Service
public class UserService {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. Создать файл application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:config.properties"/>

    <bean id="userService" class="UserService">
        <property name="name" value="${name}"/>
    </bean>
</beans>
  1. написать тестовый класс
@Service
public class Test {
    @Resource
    private UserService userService;

    @PostConstruct
    public void getName(){
        System.out.println(userService.getName());
    }
}

Таким образом, bean-компонент должен быть загружен через Spring, прежде чем можно будет внедрить значение атрибута.Написанный здесь @PostConstruct предназначен только для тестирования, и перед запуском необходимо создать класс запуска. Обратите внимание, что внедренные свойства должны реализовывать методы установки, такие как setName.

8. Чтение конфигурации на основе аннотаций

Еще пример вышеописанного метода, на этот раз XML нужно только загрузить свойства, а автоматическая инъекция выполняется с помощью аннотации @Value.

  1. импортировать зависимости
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>
  1. написать приложение.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:config.properties"/>

</beans>
  1. Написать UserService
public class UserService {
    @Value("${name}")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Отправить зону благосостояния