Java Language
Klasa właściwości
Szukaj…
Wprowadzenie
Obiekt właściwości zawiera parę klucz i wartość zarówno jako ciąg. Klasa java.util.Properties jest podklasą Hashtable.
Można go użyć do uzyskania wartości nieruchomości na podstawie klucza właściwości. Klasa Properties zapewnia metody pobierania danych z pliku właściwości i przechowywania danych w pliku właściwości. Ponadto można go wykorzystać do uzyskania właściwości systemu.
Zaletą pliku właściwości
Rekompilacja nie jest wymagana, jeśli informacje zostaną zmienione z pliku właściwości: jeśli jakiekolwiek informacje zostaną zmienione z
Składnia
- W pliku właściwości:
- klucz = wartość
- #komentarz
Uwagi
Obiekt Właściwości to mapa, której klucze i wartości są zgodnie z konwencją ciągami. Chociaż do uzyskiwania dostępu do danych można użyć metod Map, zwykle stosowane są metody bezpieczniejsze dla typu getProperty , setProperty i stringPropertyNames .
Właściwości są często przechowywane w plikach właściwości Java, które są prostymi plikami tekstowymi. Ich format jest dokładnie udokumentowany w metodzie Properties.load . W podsumowaniu:
- Każda para klucz / wartość linii tekstu z odstępami równa (
=
) lub okrężnicy (:
) pomiędzy kluczem i wartości. Znak równości lub dwukropek może mieć dowolną ilość białych znaków przed i po nim, co jest ignorowane. - Wiodące białe znaki są zawsze ignorowane, końcowe białe znaki są zawsze uwzględniane.
- Odwrotnego ukośnika można użyć do zmiany znaczenia dowolnego znaku (z wyjątkiem małych liter
u
). - Odwrotny ukośnik na końcu linii wskazuje, że następny wiersz jest kontynuacją bieżącej linii. Jednak, podobnie jak w przypadku wszystkich linii, wiodące białe znaki w linii kontynuacji są ignorowane.
- Podobnie jak w kodzie źródłowym Java
\u
, a następnie czterech cyfr szesnastkowych reprezentuje UTF-16 znaków.
Większość platform, w tym własne narzędzia Java SE, takie jak java.util.ResourceBundle, ładują pliki właściwości jako InputStreams. Podczas ładowania pliku właściwości z InputStream, plik ten może zawierać tylko znaki ISO 8859-1 (to znaczy znaki z zakresu 0–255). Wszelkie inne znaki muszą być reprezentowane jako \u
ucieka. Możesz jednak napisać plik tekstowy w dowolnym kodowaniu i użyć narzędzia native2ascii (dostarczanego z każdym pakietem JDK), aby to zrobić.
Jeśli ładujesz plik właściwości z własnym kodem, może on być w dowolnym kodowaniu, pod warunkiem, że utworzysz czytnik (na przykład InputStreamReader ) na podstawie odpowiedniego zestawu znaków . Następnie można załadować plik przy użyciu metody load (Reader) zamiast starszej metody load (InputStream).
Możesz także przechowywać właściwości w prostym pliku XML, który pozwala samemu plikowi zdefiniować kodowanie. Taki plik można załadować za pomocą metody loadFromXML . DTD opisujący strukturę takich plików XML znajduje się na stronie http://java.sun.com/dtd/properties.dtd .
Ładowanie właściwości
Aby załadować plik właściwości dołączony do aplikacji:
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);
}
}
}
Zastrzeżenie dotyczące plików właściwości: końcowe białe znaki
Przyjrzyj się dokładnie dwóm plikom właściwości, które wydają się całkowicie identyczne:
z wyjątkiem tego, że tak naprawdę nie są identyczne:
(zrzuty ekranu pochodzą z Notepad ++)
Ponieważ końcowe spacje jest zachowana wartość lastName
byłoby "Smith"
w pierwszym przypadku i "Smith "
w drugim przypadku.
Bardzo rzadko tego oczekują użytkownicy i można jedynie spekulować, dlaczego jest to domyślne zachowanie klasy Properties
. Łatwo jest jednak utworzyć ulepszoną wersję Properties
która rozwiązuje ten problem. Następująca klasa, TrimmedProperties , właśnie to robi. Jest to zamiennik standardowej klasy właściwości.
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;
}
}
Zapisywanie właściwości jako XML
Przechowywanie właściwości w pliku XML
Sposób przechowywania plików właściwości jako plików XML jest bardzo podobny do sposobu przechowywania ich jako plików .properties
. Po prostu zamiast używać store()
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");
}
Po otwarciu plik będzie wyglądał następująco.
Ładowanie właściwości z pliku XML
Teraz, aby załadować ten plik jako properties
, musisz wywołać loadFromXML()
zamiast load()
, którego używałbyś ze zwykłymi plikami .propeties
.
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);
}
}
Po uruchomieniu tego kodu otrzymasz w konsoli następujące informacje:
age=23
color=green
name=Steve