web-dev-qa-db-fra.com

Barre oblique inversée des propriétés Java

J'utilise Java Properties pour lire un fichier de propriétés. Tout fonctionne bien, mais Propriétés supprime silencieusement les barres obliques inverses.

(c'est à dire.)

original: c:\sdjf\slkdfj.jpg

after: c:sdjfslkdfj.jpg

Comment est-ce que je fais des propriétés pas ceci?

J'utilise le code prop.getProperty(key)

Je reçois les propriétés d'un fichier et je veux éviter d'ajouter des doubles barres obliques inverses

42
JavaIsGreat

C'est Properties.load () qui est à l'origine du problème que vous voyez car la barre oblique inverse est utilisée à des fins spéciales.

La ligne logique contenant toutes les données car une paire d'éléments clé peut être étendue sur plusieurs naturelles adjacentes lignes en échappant le terminateur de ligne séquence avec une barre oblique inverse, \.

Si vous ne pouvez pas utiliser la suggestion de CoolBeans, vous pouvez alors lire le fichier de propriétés au préalable dans une chaîne, remplacer la barre oblique inverse par une double barre oblique inversée, puis le transmettre à Properties.load ()

String propertyFileContents = readPropertyFileContents();

Properties properties = new Properties();
properties.load(new StringReader(propertyFileContents.replace("\\", "\\\\")));
47
Bala R

Utilisez des doubles barres obliques inversées c:\\sdjf\\slkdfj.jpg

Properties props = new Properties();
props.setProperty("test", "C:\\dev\\sdk\\test.dat");
System.out.println(props.getProperty("test"));    // prints C:\dev\sdk\test.dat

MET À JOURCREDIT en @ewh ci-dessous. Apparemment, Windows reconnaît les barres obliques. Donc, je suppose que vous pouvez demander à vos utilisateurs de l'écrire avec des barres obliques à la place et si vous avez besoin de barres obliques inverses par la suite, vous pouvez les remplacer. J'ai testé cet extrait ci-dessous et cela fonctionne bien.

Properties props = new Properties();
props.setProperty("test", "C:/dev/sdk/test.dat");
System.out.println(props.getProperty("test"));   // prints C:/dev/sdk/test.dat
16
CoolBeans

Utilisez forward slash. En Java, il n’est jamais nécessaire d’utiliser une barre oblique inverse dans un nom de fichier.

10
user207421

Au cas où vous auriez réellement besoin d'une barre oblique inverse dans un fichier de propriétés qui sera chargé (comme pour une propriété qui n'est pas un chemin de fichier) put \u005c pour chaque caractère de barre oblique inversée.

La barre oblique inverse est traitée spécialement dans les fichiers de propriétés, comme indiqué dans le document fourni par @unhillbilly.

@EJP: Une barre oblique inverse est absolument nécessaire si, par exemple, vous souhaitez stocker un identifiant de connexion NTLM dans un fichier de propriétés, où le format est DOMAIN\USERNAME avec une barre oblique inverse. Ce type de propriété est not un nom de fichier; les barres obliques ne fonctionneront donc pas.

Edit: @Max Nanasy: À partir du document ( Java.util.Properties load javadoc ) mentionné ci-dessus (emphase mien)

La méthode ne traite pas une barre oblique inverse, '\', avant un caractère d'échappement non valide comme une erreur; la barre oblique inverse est supprimée silencieusement. Par exemple, dans une chaîne Java, la séquence "\ z" provoquerait une erreur lors de la compilation. En revanche, cette méthode supprime silencieusement la barre oblique inversée. Par conséquent, cette méthode considère la séquence de deux caractères "\ b" comme équivalente au caractère unique "b".

Pour moi, j'ai toujours eu des problèmes avec les barres obliques inverses dans le fichier de propriétés (même avec la double barre oblique inversée '\\'), sauf si j'ai spécifié le code unicode.

6
frooble

En plus de la réponse de Bala R, j'ai la solution suivante pour même conserver la nouvelle ligne sémantique des barres obliques inverses à la fin d'une ligne.

Voici mon code:

private static Reader preparePropertyFile(File file) throws IOException {

    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder result = new StringBuilder();

    String line;
    boolean endingBackslash = false;

    while ((line = reader.readLine()) != null) {
        line = line.trim();
        if (endingBackslash) {

            // if the line is empty, is a comment or holds a new property
            // definition the backslash found at the end of the previous
            // line is not for a multiline property value.
            if (line.isEmpty()
                    || line.startsWith("#")
                    || line.matches("^\\w+(\\.\\w+)*=")) {

                result.append("\\\\");
            }
        }

        // if a backslash is found at the end of the line remove it
        // and decide what to do depending on the next line.
        if (line.endsWith("\\")) {
            endingBackslash = true;
            line = line.substring(0, line.length() - 1);
        } else {
            endingBackslash = false;
        }
        result.append(line.replace("\\", "\\\\"));
    }
    if (endingBackslash) {
        result.append("\\\\");
    }
    return new StringReader(result.toString());
}

private static Properties getProperties(File file) throws IOException {
    Properties result = new Properties();
    result.load(preparePropertyFile(file));
    return result;
}
2
AlexS

Remplacez \ par \\ comme ci-dessous:

c:\sdjf\slkdfj.jpg 

à 

c:\\sdjf\\slkdfj.jpg
1
Dileep Dondapati

Ce n'est pas vraiment une bonne chose d'utiliser des barres obliques inverses dans un fichier de propriétés, car elles sont le caractère d'échappement. 

Néanmoins: un utilisateur Windows aura tendance à les utiliser dans n'importe quel chemin ... Par conséquent, sur une seule ligne, merci à Apache IO commun:

params.load(new StringReader(IOUtils.toString(paramFile.toURI(), null).replaceAll("\\\\", "/")));
0
Olivier Faucheux

Le code suivant aidera:

BufferedReader metadataReader = new BufferedReader(new InputStreamReader(new FileInputStream("migrateSchemaGenProps.properties")));
Properties props = new Properties();
props.load(new StringReader(IOUtils.getStringFromReader(metadataReader).replace("\\", "/")));
0
Vaibhav Jain