Java Language
Eigenschappen Klasse
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:
behalve dat ze echt niet identiek zijn:
(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.
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