Cómo almacenar una matriz en un archivo de propiedades de Java

6 minutos de lectura

avatar de usuario de sí

Actualmente estoy creando un archivo .properties que debe cargarse y transformarse en una matriz.
Existe la posibilidad de que existan entre 0 y 25 de cada una de las claves de propiedad.

Probé algunas implementaciones, pero estoy atascado en hacer esto limpiamente.
¿Alguien tiene alguna idea?

foo.1.filename=foo.txt
foo.1.expire=200

foo.2.filename=foo2.txt
foo.2.expire=10

etc more foo's

bar.1.filename=bar.txt
bar.1.expire=100

Donde ensamblaré los emparejamientos de nombre de archivo/caducidad en un objeto de datos, como parte de una matriz para cada elemento de propiedad principal como foo[myobject]

El formato del archivo de propiedades puede cambiar, estoy abierto a ideas.

  • No tengo muy claro lo que está haciendo, pero ¿simplemente poner las propiedades en un mapa funciona? Te permite hacer if(foo.has('filename'))y para almacenar/cargar, simplemente (des)serializarlo…

    – josh.trow

    10 de agosto de 2011 a las 17:59

  • ¿Puede crear clases que contengan todas las propiedades que podría usar en el archivo .properties, o algunas propiedades serán dinámicas?

    – mellamokb

    10 de agosto de 2011 a las 17:59

  • @mellamokb: ya tengo mi clase que contiene nombre de archivo + atributos de caducidad y métodos, y creo nuevos objetos a partir de ella. ¿Está sugiriendo tal vez agregarle un atributo de “tipo”, para contener los “foo” y “bar”? … Podría funcionar, lo piratearé …

    – sí

    10 de agosto de 2011 a las 18:05

  • Creo que un archivo de datos (como un .csv) sería más fácil. Las propiedades no están realmente diseñadas para esto.

    – Saltar cabeza

    10 de agosto de 2011 a las 18:19

Avatar de usuario de Abs
Abdominales

Puedo sugerir usar delimitadores y usar el

String.split(delimiter)

Archivo de propiedades de ejemplo:

MON=0800#Algo#Algo1, Algo2

prop.load(new FileInputStream("\\\\Myseccretnetwork\\Project\\props.properties"));
String[]values = prop.get("MON").toString().split("#");

Espero que ayude

  • Simple y fácil. Perfecto

    – Sairam

    26 mayo 2016 a las 22:58

  • Pero el problema con este enfoque es que los datos en el archivo de propiedades deben estar en una línea.

    – Estoy enojado

    24 de agosto de 2017 a las 20:58

No capté exactamente tu intención. Verifique la biblioteca de configuración de Apache Commons http://commons.apache.org/configuration/

Puede tener múltiples valores contra una clave como en key=value1,value2 y puede leer esto en una matriz como configuration.getAsStringArray("key")

  • Estoy tratando de evitar eso, ya que en un futuro muy cercano, los campos contendrán , ; :

    – sí

    10 de agosto de 2011 a las 18:07

  • Gracias Venu K. Puede que esto no sea lo que necesitaba, pero es lo que necesitaba.

    –Warren Reilly

    21/07/2014 a las 15:30

  • Buena sugerencia, este enfoque es muy útil, gracias.

    – cнŝdk

    30 de marzo de 2018 a las 15:52

Defina un delimitador que no sea un valor potencial o aprenda a usar XML.

Si aún insiste en usar propiedades, use uno de los métodos que devolverá una lista de todas las claves. Su clave parece tener tres partes: un identificador de grupo (foo, bar), un índice (1, 2) y luego un nombre de elemento (nombre de archivo, caducar). Consigue todas las llaves, divídelas en sus partes componentes. Cree una Lista para cada tipo de identificador, cuando procese la lista use el identificador para determinar a qué Lista agregar. ¡Cree sus elementos emparejados como dijo y simplemente agréguelos a la lista! Si el orden del índice es importante, agréguelo como un campo a sus elementos emparejados u ordene las claves antes de procesar.

  • Usa XML o lidia con el dolor

    – Adriaan Koster

    10 de agosto de 2011 a las 18:40

  • Abandoné ese formato de propiedades y usé xml. Mucho más limpio. Más extensible para el futuro. Gracias por empujarme en la dirección correcta.

    – sí

    15 de agosto de 2011 a las 13:28


  • Dios, me encanta esta respuesta, pero desafortunadamente, algunos de nosotros estamos atados por la burocracia y/o las “limitaciones administrativas” que exigen el uso de .properties en lugar de .xml. No describiré mi posición actual, pero, ya sabes. (También, nigromancia.)

    – repollo

    23 mayo 2013 a las 18:28

  • no estoy de acuerdo Yo uso JSON y XML. Siempre que no haya un estándar “real” para los esquemas json, prefiero XML para configuraciones complejas. Cuando trabaja en algo en equipo y tiene la carga del mantenimiento y el desarrollo continuo basado en ello, una definición de esquema adecuada no tiene precio. Sin restricciones significa muchos dolores de cabeza y discusiones sobre cómo hacer las cosas. O peor aún, sin discusión, cualquiera implementará lo que quiera que se ajuste a sus necesidades y rápidamente terminará en un infierno de configuración. También es bueno tener el autocompletado en los archivos de configuración de otra persona.

    usuario1441149

    22 de febrero de 2015 a las 9:37


  • Json es tan bueno, ¡usa Yaml!

    –Hans Westerbeek

    11 de diciembre de 2017 a las 15:21

Avatar de usuario de Sangeeth
Sangeeth

Usar YAML archivos para propiedades, esto admite propiedades como una matriz.

Vistazo rápido sobre YAML:

Un superconjunto de JSON, puede hacer todo lo que JSON puede hacer y más

  1. Fácil de leer
  2. Propiedades largas en valores multilínea
  3. Soporta comentarios
  4. Propiedades como matriz
  5. Validación YAML

Tengo carga personalizada. Las propiedades deben definirse como:

key.0=value0
key.1=value1
...

Carga personalizada:

/** Return array from properties file. Array must be defined as "key.0=value0", "key.1=value1", ... */
public List<String> getSystemStringProperties(String key) {

    // result list
    List<String> result = new LinkedList<>();

    // defining variable for assignment in loop condition part
    String value;

    // next value loading defined in condition part
    for(int i = 0; (value = YOUR_PROPERTY_OBJECT.getProperty(key + "." + i)) != null; i++) {
        result.add(value);
    }

    // return
    return result;
}

Avatar de usuario de Jack Cox
Jack Cox

Recomiendo usar Apache Commons (http://commons.apache.org/configuration/). Tiene la capacidad de utilizar un archivo XML como archivo de configuración. El uso de una estructura XML facilita la representación de matrices como listas de valores en lugar de propiedades numeradas especialmente.

avatar de usuario de boly38
boly38

aquí hay otra forma de hacerlo implementando usted mismo el mecanismo. aquí consideramos que la matriz debería comenzar con 0 y no tendría ningún hueco entre el índice

    /**
     * get a string property's value
     * @param propKey property key
     * @param defaultValue default value if the property is not found
     * @return value
     */
    public static String getSystemStringProperty(String propKey,
            String defaultValue) {
        String strProp = System.getProperty(propKey);
        if (strProp == null) {
            strProp = defaultValue;
        }
        return strProp;
    }

    /**
     * internal recursive method to get string properties (array)
     * @param curResult current result
     * @param paramName property key prefix
     * @param i current indice
     * @return array of property's values
     */
    private static List<String> getSystemStringProperties(List<String> curResult, String paramName, int i) {
        String paramIValue = getSystemStringProperty(paramName + "." + String.valueOf(i), null);
        if (paramIValue == null) {
            return curResult;
        }
        curResult.add(paramIValue);
        return getSystemStringProperties(curResult, paramName, i+1);
    }

    /**
     * get the values from a property key prefix
     * @param paramName property key prefix
     * @return string array of values
     */
    public static String[] getSystemStringProperties(
            String paramName) {
        List<String> stringProperties = getSystemStringProperties(new ArrayList<String>(), paramName, 0);
        return stringProperties.toArray(new String[stringProperties.size()]);
    }

Aquí hay una manera de probar:

    @Test
    public void should_be_able_to_get_array_of_properties() {
        System.setProperty("my.parameter.0", "ooO");
        System.setProperty("my.parameter.1", "oO");
        System.setProperty("my.parameter.2", "boo");
        // WHEN 
        String[] pluginParams = PropertiesHelper.getSystemStringProperties("my.parameter");

        // THEN
        assertThat(pluginParams).isNotNull();
        assertThat(pluginParams).containsExactly("ooO","oO","boo");
        System.out.println(pluginParams[0].toString());
    }

espero que esto ayude

y todos los comentarios son bienvenidos..

¿Ha sido útil esta solución?