2010-01-21 9 views
29

Estamos obteniendo propiedades (que no podemos influenciar) de una base de datos y queremos acceder a ellas mediante una asignación de clave/valor. Nos enfrentamos al problema de que una de las claves de propiedad incluye un carácter en blanco.¿Puede la clave en una propiedad de Java incluir un carácter en blanco?

foo bar = barefoot 

Esto es - correctamente - interpreta de la siguiente

key: foo 
value: bar = barefoot 

¿Hay una manera de incluir el espacio en blanco en la clave por lo que no es interpretada como el delimitador? Supongo que este comportamiento es como el previsto, pero pensé que podría intentarlo aquí.

+2

Es allí mismo, en los documentos: http://java.sun.com/javase/6/docs/api/java/util/Properties .html # load (java.io.Lector) –

Respuesta

11

Como parece, el delimitador debe ser =, no el espacio. Por lo tanto - keyValuePair.split("=") debería hacer.

Si va a cargar esto desde un archivo java .properties, entonces se puede extender java.util.Properties y reemplazar este método

public synchronized void load(InputStream inStream) throws IOException 

de modo que analiza las propiedades correctamente.

+2

Hm, los métodos de anulación en 'Propiedades' parecen dubios en el mejor de los casos. Probablemente haya muchas suposiciones codificadas en la clase Propiedades, por lo que es una fuente de errores futuros. Si no es un archivo de propiedades adecuado, preferiría no utilizar Propiedades para leerlo. – sleske

+0

Al menos hay que intentarlo, ya que ahorraría mucho tiempo. Si no funciona, cree un análisis de propiedades por separado del curso – Bozho

+0

¿Cómo se configura 'keyValuePair.split (" = ")'? – Xonatron

12

Tal vez se puede escapar de los espacios en blanco: foo\ bar = barefoot

Editar: Vaya, no he visto que no se puede cambiar las propiedades.

+2

No hay tal cosa al respecto: http://pastie.org/787892 Produce http://pastie.org/787893 –

+0

Los espacios en blanco de escape no funcionarán con la mayoría de los editores que recortan espacios al final de las líneas de forma predeterminada. Piense en un parámetro mainframe que necesita espacios finales. Correcto es la solución de Veaceslav. –

4

Supongo que por "propiedades", quiere decir un archivo de propiedades de Java (como está escrito/leído por java.util.Properties).

Luego, a medida que escribe usted mismo,

foo bar = barefoot 

de hecho, debe interpretarse en

key: foo 
value: bar = barefoot 

No hay manera de configurar esto usando el incorporado en Properties clase. Debe manipular su entrada (escape del espacio en blanco, cámbielo a _ y atras ...), o escriba su propio analizador. Escribir tu propio analizador es probablemente mejor, ya que obviamente tu entrada no es realmente un archivo de propiedades Java para empezar :-).

+3

+1 "realmente no es un archivo de propiedades de Java para comenzar". La gente ve "clave = valor" y asume que es un archivo de propiedades. Se olvidan de que hay muchas reglas sobre el archivo de propiedades, y si su entrada no sigue ** todos **, entonces no es un archivo de propiedades. Otro ejemplo: las propiedades de Java usan la codificación Latin1 (a.k.a ISO-8859-1) de forma predeterminada y admiten escapes Unicode. –

+0

Escribir su propio analizador también debería ocuparse del bloque de comentarios en .properties. –

+0

@OmSao: cierto. Eso ilustra muy bien el problema de que es importante asegurarse de comprender exactamente qué puede contener o no el archivo. – sleske

114

Puede escapar cada cosa en archivo de propiedades con Java Unicode:

  • \u003d para =
  • \u0020 de espacios en blanco

Por ejemplo:

foo bar = barefoot 

debe ser:

foo\u0020bar\u0020=\u0020barefoot 

Así será:

key: "foo bar " 
value: " barefoot" 
+7

Esta es la respuesta "Correcta". Todas las demás opciones terminarán con soluciones no estándar. POR FAVOR use esta respuesta :) – Yinzara

+1

Sí, ¡funcionó! Esta es la respuesta correcta. – Artin

+1

Tenga en cuenta que esto parece no funcionar en los archivos de configuración de Grails (no .grown pero .properties; probado en 2.5.1). – Newerth

0
keyValuePair = keyValuePair.substring(0,indexOf("=")).replaceAll("\\s+") + 
       keyValuePair.substring(indexOf("=")); 
Cuestiones relacionadas