Stack Overflow a une question _ «Est-ce que .NET peut charger et analyser un fichier de propriétés équivalent à la classe Propriétés Java?» (janvier 2009) _ Je demande comment lire le fichier de propriétés en C #. Il existe des cas comme le questionneur qui souhaite lire le fichier de propriétés existant tel quel en C # sans apporter de modifications.
Il y a des réponses codées à la question, mais aucune des implémentations n'est pratique, sauf ma réponse. .. Certains ajoutent même des spécifications qui n'existent pas. Traitez ;
et
comme des caractères de début de ligne de commentaire et supprimez les guillemets entourant les valeurs de propriété.
Après tout, il n'y a pas d'autre choix que de le fabriquer vous-même.
La spécification du fichier de propriétés Java est [java.util.Properties.load (java.io.Reader)](https://docs.oracle.com/javase/9/docs/api/java/util/Properties. Il est écrit en JavaDoc de html # load-java.io.Reader-) </ code>. Le problème est que les spécifications sont un peu plus compliquées que vous ne l'imaginez. Bien que non exhaustifs, les points suivants doivent être considérés en particulier.
\ u0020
), des tabulations ( \ t
, \ u0009
) et des sauts de ligne ( \ f
, \ u000C
).=
est utilisé comme séparateur clé / valeur.:
Est également utilisé comme séparateur clé / valeur.=
, :
et les caractères vides peuvent également être incorporés dans la clé en les échappant avec une barre oblique inverse.\ uxxxx
représente le caractère Unicode.C'est pourquoi, par exemple, si test.properties
a le contenu suivant:
# A comment line that starts with '#'.
# This is a comment line having leading white spaces.
! A comment line that starts with '!'.
key1=value1
key2 : value2
key3 value3
key\
4=value\
4
\u006B\u0065\u00795=\u0076\u0061\u006c\u0075\u00655
\k\e\y\6=\v\a\lu\e\6
\:\ \= = \\colon\\space\\equal
Il doit être interprété comme le groupe de paires clé-valeur suivant.
Clé | valeur |
---|---|
key1 |
value1 |
key2 |
value2 |
key3 |
value3 |
key4 |
value4 |
key5 |
value5 |
key6 |
value6 |
: = |
\colon\space\equal |
NuGet La classe PropertiesLoader
contenue dans le package" Authlete.Authlete "est le fichier Properties. Peut interpréter les spécifications de. L'exemple de code suivant
using System;
using System.IO;
using System.Collections.Generic;
using Authlete.Util;
namespace MyApp
{
class Program
{
public static void Main(string[] args)
{
string file = "test.properties";
IDictionary<string, string> properties;
using (TextReader reader = new StreamReader(file))
{
properties = PropertiesLoader.Load(reader);
}
foreach (var entry in properties)
{
Console.WriteLine($"{entry.Key} = {entry.Value}");
}
}
}
}
Produit la sortie suivante.
key1 = value1
key2 = value2
key3 = value3
key4 = value4
key5 = value5
key6 = value6
: = = \colon\space\equal
Voici un code similaire en Java:
import java.util.*;
import java.io.*;
public class Program
{
public static void main(String[] args) throws IOException
{
String file = "test.properties";
Properties properties = new Properties();
try (Reader reader = new FileReader(file))
{
properties.load(reader);
}
for (Map.Entry<Object, Object> entry : properties.entrySet())
{
System.out.format("%s = %s\n", entry.getKey(), entry.getValue());
}
}
}
Le code source de PropertiesLoader.cs </ code> est authlete-csharp Il existe dans (: //github.com/authlete/authlete-csharp). De plus, le groupe de test xUnit pour
PropertiesLoader
est [PropertiesLoaderTest.cs](https://github.com/authlete/authlete-csharp/blob/ Il est décrit dans master / Authlete.Tests / Util / PropertiesLoaderTest.cs) </ code>.
Recommended Posts