Zoeken…


Invoering

Het eigenschappenobject bevat sleutel en waardepaar beide als een tekenreeks. De klasse java.util.Properties is de subklasse van Hashtable.

Het kan worden gebruikt om eigenschapswaarde te verkrijgen op basis van de eigenschapssleutel. De klasse Eigenschappen biedt methoden om gegevens uit het eigenschappenbestand te halen en gegevens in het eigenschappenbestand op te slaan. Bovendien kan het worden gebruikt om eigenschappen van het systeem te krijgen.

Voordeel van eigenschappenbestand

Hercompilatie is niet vereist als informatie wordt gewijzigd vanuit het eigenschappenbestand: Als er informatie wordt gewijzigd vanuit

Syntaxis

  • In een eigenschappenbestand:
  • key = value
  • #commentaar

Opmerkingen

Een object Properties is een kaart waarvan de sleutels en waarden Strings volgens conventie zijn. Hoewel de methoden van Map kunnen worden gebruikt om toegang tot de gegevens te krijgen, worden meestal de meer typeveilige methoden getProperty , setProperty en stringPropertyNames gebruikt.

Eigenschappen worden vaak opgeslagen in Java-eigenschappenbestanden, dit zijn eenvoudige tekstbestanden. Hun indeling is grondig gedocumenteerd in de methode Properties.load . Samengevat:

  • Elke sleutel / waardepaar een tekstregel whitespace, gelijk aan ( = ) of dubbele punt ( : ) tussen de sleutel en de waarde. De gelijken of dubbele punt kan een willekeurige hoeveelheid witruimte ervoor en erna hebben, die wordt genegeerd.
  • Voorloop witruimte wordt altijd genegeerd, achterloop witruimte is altijd inbegrepen.
  • Een backslash kan worden gebruikt om aan elk teken te ontsnappen (behalve kleine letters u ).
  • Een backslash aan het einde van de regel geeft aan dat de volgende regel een voortzetting is van de huidige regel. Zoals bij alle regels wordt witruimte in de vervolgregel echter genegeerd.
  • Net als in de Java-broncode vertegenwoordigt \u gevolgd door vier hexadecimale cijfers een UTF-16-teken.

De meeste frameworks, inclusief de eigen voorzieningen van Java SE zoals java.util.ResourceBundle, laden eigenschappenbestanden als InputStreams. Bij het laden van een eigenschappenbestand uit een InputStream mag dat bestand alleen ISO 8859-1-tekens bevatten (dat wil zeggen tekens in het bereik 0-255). Alle andere tekens moeten worden weergegeven als \u ontsnapt. U kunt echter een tekstbestand in elke codering schrijven en de native2ascii- tool (die bij elke JDK wordt geleverd) gebruiken om dat voor u te doen ontsnappen.

Als u een eigenschappenbestand met uw eigen code laadt, kan dit in elke codering zijn, zolang u een Reader (zoals een InputStreamReader ) maakt op basis van de bijbehorende tekenset . U kunt het bestand vervolgens laden met behulp van load (Reader) in plaats van de legacy-methode load (InputStream).

U kunt ook eigenschappen opslaan in een eenvoudig XML-bestand, waarmee het bestand zelf de codering kan definiëren. Een dergelijk bestand kan worden geladen met de methode loadFromXML . De DTD die de structuur van dergelijke XML-bestanden beschrijft, bevindt zich op http://java.sun.com/dtd/properties.dtd .

Eigenschappen laden

Een eigenschappenbestand laden dat is gebundeld met uw toepassing:

public class Defaults {

    public static Properties loadDefaults() {
        try (InputStream bundledResource =
            Defaults.class.getResourceAsStream("defaults.properties")) {

            Properties defaults = new Properties();
            defaults.load(bundledResource);
            return defaults;
        } catch (IOException e) {
            // Since the resource is bundled with the application,
            // we should never get here.
            throw new UncheckedIOException(
                "defaults.properties not properly packaged"
                + " with application", e);
        }
    }

}

Eigenschapsbestanden waarschuwing: witruimte achter

Bekijk deze twee bestanden met eigenschappen die volledig identiek lijken te zijn:

voer hier de afbeeldingsbeschrijving in

behalve dat ze echt niet identiek zijn:

voer hier de afbeeldingsbeschrijving in

(screenshots zijn van Kladblok ++)

Omdat witruimte achterblijft, is de waarde van lastName "Smith" in het eerste geval en "Smith " in het tweede geval.

Zeer zelden is dit wat gebruikers verwachten en kan dit alleen maar speculeren waarom dit het standaardgedrag van de klasse Properties . Het is echter eenvoudig om een verbeterde versie van Properties die dit probleem oplost. De volgende klasse, TrimmedProperties , doet precies dat. Het is een vervangende drop-in voor de standaardeigenschappenklasse.

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * Properties class where values are trimmed for trailing whitespace if the
 * properties are loaded from a file.
 *
 * <p>
 * In the standard {@link java.util.Properties Properties} class trailing
 * whitespace is always preserved. When loading properties from a file such
 * trailing whitespace is almost always <i>unintentional</i>. This class fixes
 * this problem. The trimming of trailing whitespace only takes place if the
 * source of input is a file and only where the input is line oriented (meaning
 * that for example loading from XML file is <i>not</i> changed by this class).
 * For this reason this class is almost in all cases a safe drop-in replacement
 * for the standard <tt>Properties</tt>
 * class.
 *
 * <p>
 * Whitespace is defined here as any of space (U+0020) or tab (U+0009).
 * * 
 */
public class TrimmedProperties extends Properties {

    /**
     * Reads a property list (key and element pairs) from the input byte stream.
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.InputStream) }
     * with the exception that trailing whitespace is trimmed from property values
     * if <tt>inStream</tt> is an instance of <tt>FileInputStream</tt>.
     * 
     * @see java.util.Properties#load(java.io.InputStream) 
     * @param inStream the input stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(InputStream inStream) throws IOException {
        if (inStream instanceof FileInputStream) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(inStream);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(inStream);
        }
    }

    /**
     * Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format. 
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.Reader)}
     * with the exception that trailing whitespace is trimmed on property values
     * if <tt>reader</tt> is an instance of <tt>FileReader</tt>.
     * 
     * @see java.util.Properties#load(java.io.Reader) }
     * @param reader the input character stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(Reader reader) throws IOException {
        if (reader instanceof FileReader) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(reader);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(reader);
        }
    }

    private void trimAndLoad(Properties p) {
        for (Entry<Object, Object> entry : p.entrySet()) {
            if (entry.getValue() instanceof String) {
                put(entry.getKey(), trimTrailing((String) entry.getValue()));
            } else {
                put(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * Trims trailing space or tabs from a string.
     *
     * @param str
     * @return
     */
    public static String trimTrailing(String str) {
        if (str != null) {
            // read str from tail until char is no longer whitespace
            for (int i = str.length() - 1; i >= 0; i--) {
                if ((str.charAt(i) != ' ') && (str.charAt(i) != '\t')) {
                    return str.substring(0, i + 1);
                }
            }
        }
        return str;
    }
}

Eigenschappen opslaan als XML

Eigenschappen opslaan in een XML-bestand

De manier waarop u eigenschappenbestanden opslaat als XML-bestanden lijkt erg op de manier waarop u ze opslaat als .properties bestanden. In plaats van store() , zou u storeToXML() .

public void saveProperties(String location) throws IOException{
    // make new instance of properties
    Properties prop = new Properties();
    
    // set the property values
    prop.setProperty("name", "Steve");
    prop.setProperty("color", "green");
    prop.setProperty("age", "23");
    
    // check to see if the file already exists
    File file = new File(location);
    if (!file.exists()){
        file.createNewFile();
    }
    
    // save the properties
    prop.storeToXML(new FileOutputStream(file), "testing properties with xml");
}

Wanneer u het bestand opent, ziet het er zo uit.

screenshot van het gemaakte bestand

Eigenschappen laden van een XML-bestand

Om dit bestand nu als properties te laden, moet u de loadFromXML() plaats van de load() die u met gewone .propeties bestanden zou gebruiken.

public static void loadProperties(String location) throws FileNotFoundException, IOException{
    // make new properties instance to load the file into
    Properties prop = new Properties();
    
    // check to make sure the file exists
    File file = new File(location);
    if (file.exists()){
        // load the file
        prop.loadFromXML(new FileInputStream(file));
        
        // print out all the properties
        for (String name : prop.stringPropertyNames()){
            System.out.println(name + "=" + prop.getProperty(name));
        }
    } else {
        System.err.println("Error: No file found at: " + location);
    }
}

Wanneer u deze code uitvoert, krijgt u het volgende in de console:

age=23
color=green
name=Steve


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow