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:

wprowadź opis zdjęcia tutaj

z wyjątkiem tego, że tak naprawdę nie są identyczne:

wprowadź opis zdjęcia tutaj

(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.

zrzut ekranu wykonanego pliku

Ł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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow