Подтвердить что ты не робот

Синхронизация строки в качестве свойств

Я читаю файл свойств из базы данных. Я проверил java.util.Properties, и нет метода для разбора из экземпляра String. Есть ли способ сделать это?

4b9b3361

Ответ 1

Вы правы, что java.util.Properties не имеет метода чтения из String - но на самом деле он имеет более общие методы, которые читаются с InputStream или Reader.

Таким образом, вы можете вызвать load, если у вас есть способ представить ваш String как любой из них, то есть источник, который эффективно выполняет итерации по символам один за другим. Это похоже на то, что он должен существовать, и действительно это происходит - java.io.StringReader.

Объединяя это, довольно просто:

public Properties parsePropertiesString(String s) {
    // grr at load() returning void rather than the Properties object
    // so this takes 3 lines instead of "return new Properties().load(...);"
    final Properties p = new Properties();
    p.load(new StringReader(s));
    return p;
}

Ответ 2

Я использую этот код для загрузки свойств из одного столбца базы данных

public Properties buildProperties(String propertiesFromString, String entrySeparator) throws IOException {
    Properties properties = new Properties();
    properties.load(new StringReader(propertiesFromString.replaceAll(entrySeparator, "\n")));
    return properties;
}

с простым тестом

@Test
public void testProperties() throws Exception {
    Properties properties = buildProperties("A=1;B=2;Z=x",";");
    assertEquals("1", properties.getProperty("A"));        
    assertEquals("2", properties.getProperty("B"));        
    assertEquals("3", properties.getProperty("C","3"));        
    assertNull(properties.getProperty("Y"));
    assertEquals("x", properties.getProperty("Z"));  
}

Ответ 3

У нас была аналогичная проблема, выше сказанное не сработало для нас.

Однако ниже было сделано.

def content = readFile 'gradle.properties'

Properties properties = new Properties()
InputStream is = new ByteArrayInputStream(content.getBytes());
properties.load(is)

def runtimeString = 'SERVICE_VERSION_MINOR'
echo properties."$runtimeString"
SERVICE_VERSION_MINOR = properties."$runtimeString"
echo SERVICE_VERSION_MINOR

Ответ 4

Эти два служебных метода могут писать и читать из String через объект java.util.Properties :

/**
 * Converts a {@link Properties} object to {@link String} and you can
 * also provide a description for the output.
 *
 * @param props an input {@link Properties} to be converted to {@link String}
 * @param desc  an input description for the output
 * @return an output String that could easily parse back to {@link Properties} object
 * @throws IOException If writing encounter a problem or if an I/O error occurs.
 */
private static String convert2String(final Properties props, String desc) throws IOException {
    final StringWriter sw = new StringWriter();
    String propStr;
    try {
        props.store(sw, desc);
        propStr = sw.toString();
    } finally {
        if (sw != null) {
            sw.close();
        }
    }

    return propStr;
}


/**
 * Converts {@link String} to {@link Properties}
 * @param propsStr an {@link String} input that is saved via convert2String method
 * @return a {@link Properties} object
 * @throws IOException if an error occurred when reading from the {@link StringReader}
 */
private static Properties convert2Properties(final String propsStr) throws IOException {
    final Properties props = new Properties();
    final StringReader sr = new StringReader(propsStr);
    try {
        props.load(sr);
    } finally {
        if (sr != null)
            sr.close();
    }

    return props;
}

Я нашел два вышеупомянутых метода полезными, когда есть много свойств и вы хотите сохранить их все в storage or database, и не хотите создавать огромную таблицу магазинов key-value.