Lesen Sie die Java-Eigenschaftendatei in C #

** Einführung **

Der Stapelüberlauf hat die Frage _ "Kann .NET eine Eigenschaftendatei laden und analysieren, die der Java-Eigenschaftenklasse entspricht?" (Januar 2009) _ Ich frage, wie man die Eigenschaftendatei in C # liest. Es gibt Fälle wie den Fragesteller, die die vorhandene Eigenschaftendatei wie in C # lesen möchten, ohne Änderungen vorzunehmen.

Es gibt einige codierte Antworten auf die Frage, aber keine der Implementierungen ist praktisch, außer meine Antwort. .. Einige fügen sogar Spezifikationen hinzu, die nicht existieren. Behandeln Sie ; oder ' als Startzeichen der Kommentarzeile oder entfernen Sie die Anführungszeichen um den Eigenschaftswert.

Schließlich bleibt nichts anderes übrig, als es selbst zu machen.

** Spezifikationen der Eigenschaftendatei **

Die Spezifikation der Java-Eigenschaftendatei lautet [java.util.Properties.load (java.io.Reader)](https://docs.oracle.com/javase/9/docs/api/java/util/Properties. Es ist in JavaDoc von HTML # load-java.io.Reader-) </ code> geschrieben. Das Problem ist, dass die Spezifikationen etwas komplizierter sind, als Sie sich vorstellen können. Obwohl nicht erschöpfend, sollten insbesondere die folgenden Punkte berücksichtigt werden.

  1. Es gibt zwei Arten von Linien: natürliche Linie und logische Linie.
  2. Natürliche Linien werden durch "\ n", "\ r", "\ r \ n" oder am Ende des Streams getrennt.
  3. Eine logische Linie kann mehrere benachbarte natürliche Linien überspannen, indem sie der Zeilenabschlusssequenz mit einem Backslash entgeht.
  4. Die Leerzeichen am Anfang der zweiten und der nachfolgenden natürlichen Zeilen in der logischen Zeile werden verworfen.
  5. Leerzeichen sind Leerzeichen (``, \ u0020), Tabulatoren ( \ t, \ u0009) und Zeilenvorschübe ( \ f, \ u000C).
  6. Wie in der Spezifikation explizit angegeben, reicht es nicht aus, das Zeichen vor der Zeilenabschlusssequenz zu betrachten, wenn festgestellt wird, ob ein Zeilenabschluss maskiert ist, da der Zeilenabschluss maskiert ist. Muss eine Reihe von ungeraden Backslashes enthalten. Die Eingabe wird von links nach rechts verarbeitet, sodass vor (oder anderswo) dem Zeilenabschluss 2n (gerade ungleich Null) Backslashes vorhanden sind. Wenn es existiert, werden n Backslashes nach dem Escapezeichen codiert. "_
  7. = wird als Schlüssel / Wert-Trennzeichen verwendet.
  8. : Wird auch als Schlüssel- / Werttrennzeichen verwendet.
  9. Das Trennzeichen zwischen dem Schlüssel und dem Wert ist optional.
  10. Die Kommentarzeile hat "#" oder "!" Als erstes nicht leeres Zeichen. Das heißt, Leerzeichen vor "#" und "!" Sind zulässig.
  11. Wenn Sie Zeilenumbrüche mit umgekehrten Schrägstrichen maskieren, können Kommentarzeilen nicht mehrere Zeilen umfassen.
  12. Wie in der Spezifikation ausdrücklich angegeben, können =, : und Leerzeichen auch durch Escapezeichen mit einem Backslash in den Schlüssel eingebettet werden.
  13. Mit den Escase-Sequenzen \ r und \ n können auch Zeilenabschlüsse eingeschlossen werden.
  14. Wenn der Wert weggelassen wird, behandeln Sie ihn als leere Zeichenfolge.
  15. \ uxxxx steht für Unicode-Zeichen.
  16. Backslashes vor Zeichen, die kein gültiges Escape-Zeichen bilden, werden nicht als Fehler behandelt und einfach gelöscht.

** Beispiele für die Eigenschaftendatei **

Das ist zum Beispiel der Fall, wenn test.properties den folgenden Inhalt hat:

# 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

Es sollte als die folgende Schlüssel-Wert-Paargruppe interpretiert werden.

Schlüssel Wert
key1 value1
key2 value2
key3 value3
key4 value4
key5 value5
key6 value6
: = \colon\space\equal

** Codebeispiel **

NuGet Die im Paket "Authlete.Authlete" enthaltene Klasse "PropertiesLoader" ist die Eigenschaftendatei. Kann die Spezifikationen von interpretieren. Das folgende Codebeispiel

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}");
            }
        }
    }
}

Erzeugt die folgende Ausgabe.

key1 = value1
key2 = value2
key3 = value3
key4 = value4
key5 = value5
key6 = value6
: = = \colon\space\equal

Hier ist ein ähnlicher Code in 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());
        }    
    }
}

Quellcode

Der Quellcode für PropertiesLoader.cs </ code> lautet authlete-csharp Es existiert in (: //github.com/authlete/authlete-csharp). Die Testgruppe xUnit für "PropertiesLoader" lautet außerdem PropertiesLoaderTest.cs. Es wird in master / Authlete.Tests / Util / PropertiesLoaderTest.cs) </ code> beschrieben.

Recommended Posts