Работа с java.util.Properties

 
 
 
Сообщения:23
Собстно такая праблемма ... пишу примерно такой код

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import db.ProperiesBuilder;
public class TestCFG {

    public static void main(String[] args) throws IOException {
	
	Properties _prop            = new Properties();
        InputStream is              = new FileInputStream(ProperiesBuilder.GLOBALCFGPATH);
        _prop.load(is);
        
	      System.out.println(ProperiesBuilder.GLOBALCFGPATH);
	      _prop.list(System.out);

    }

}



Содержимое файла global.properties

testprop=test
..... и т.д

а вот что выводит в консоль при запуске
global.properties
-- listing properties --



подскажите пожалуйсто в чом трабла..... :(
 
 
Сообщения:23
проблемма решина.....
 
 
Сообщения:3866
И в чем была проблема?
 
 
Сообщения:1184
В решине :?

Не знала Настя, где зад, где перёд. Показали - разобралась.
 
 
Сообщения:23
все бонально , неправельно указал путь к файлу конфигураций...

Сейчас другая проблемма вплыла..... очень прошу помоч...

есть такой класс.

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;


public final class ProperiesBuilder {
    
    public static final String GLOBALCFGPATH = "./etc/global.properties";
  
    public static String DATABASE_URL;
  
    public static String DATABASE_LOGIN;
  
    public static String DATABASE_PASSWORD;
  
    public static String DEFAULT_CHARSET;
   
    public static boolean IS_DEFAULT_CONNECTION_USED;
   
    public static String PORT;



    public static  void getDefaultDBConfig(){

    try{

        Properties _prop            = new Properties();
        InputStream is              = new FileInputStream(GLOBALCFGPATH);
        _prop.load(is);
        is.close();

        PORT       = _prop.getProperty("Port","3306");
        DATABASE_URL                = _prop.getProperty("URL", "jdbc:mysql://localhost/medfin");
        DATABASE_LOGIN              = _prop.getProperty("Login", "root");
        DATABASE_PASSWORD           = _prop.getProperty("Password", "");
        IS_DEFAULT_CONNECTION_USED  = Boolean.parseBoolean(_prop.getProperty("SaveCfg"));



    }catch (Exception e) {
        e.getMessage();
        throw new Error("Ошибка загрузки файла конфигураций :" + GLOBALCFGPATH);

    }
    }
 
    private ProperiesBuilder() {}



}


задача единственного метода getDefaultDBConfig() выбрать из файла конфигураций необходимые значения и присвоить их свойствам класса ...

Но вот в чом проблемма когда я вызываю переменную класса из другого, например

private void initialize() {
        this.setSize(new Dimension(436, 317));
        this.setLocation((Util.getScreenSize().width - StringMessages.Setings_WIDTH)/2, (Util.getScreenSize().height - StringMessages.Setings_HIGHT)/2);
        this.setTitle("Параметры соединения с БД");
        this.setResizable(false);
        this.setModal(true);
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        this.setContentPane(getJContentPane());
        this.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent e) {
//сдесь jTextField при загрузки прилажения присваеваются дефолтные значения из фала конфигураций
 
            jTextField.setText(ProperiesBuilder.DATABASE_URL);
            jTextField1.setText(ProperiesBuilder.DATABASE_LOGIN);
            jTextField2.setText(ProperiesBuilder.PORT);
            jPasswordField.setText(ProperiesBuilder.DATABASE_PASSWORD);
            }
        });
    }


то получаю NULL

причом _prop.list(System.out) выводит

-- listing properties --
URL=jdbc:mysql://localhost/test
SaveCfg=false
Password=login
Login=login
Charset=utf-8
Port=3306


укажите на мой косяк пожалуйсто.. Java язык для меня новый поэтому могу что то забыть...
Если можно то с примером...
Зарание спасибо...
 
 
Сообщения:23
все сам решение нашел.... просто я забыл инициализировать поля метода getDefaultDBConfig()
 
 
Сообщения:23
Блин сам с собой разговариваю ((( ну да лана...

Вопрос к гуру ...

Есть ли способ изменять отдельные параметры ф файле сонфигураций без переписования(или затирания) всех остальных?
к примеру
есть такой конфиг.

URL=jdbc:mysql://localhost/test
SaveCfg=false
Password=login
Login=login
Charset=utf-8
Port=3306

мне нужно изменить только Port без перезаписи остальных параметров как такое сделать ...??
 
 
Сообщения:1960
lasar:
мне нужно изменить только Port без перезаписи остальных параметров как такое сделать ...??

Оно и будет меняться только одно - коллективного метода set не существует.


aka ur6lad
 
 
Сообщения:23
Я неспорю ... setProperties() работает как надо, а вот когда применяеш save вот тогда почемуто происходит звтирание всего фала и пишится только то что передано через setProperties()...

если можно примерчик маленький как правельно заменять существующие параметры и сохронять....
 
 
Сообщения:1960
lasar:
если можно примерчик маленький как правельно заменять существующие параметры и сохронять....

Хм. Что сложного в последовательности load; set(бла-бла-бла); save?

Или, если вам не нравиться каждый раз грузить properties:

- загружаете набор default_properties один раз;
- на его базе делает новый work_properties = new Properties(default_properties), уже рабочий (тоесть доступную для любых изменений).
- по мере необходимости сохраняете или полностью модифицированный work_properties или создаёте новый update_properties = new Properties(default_properties), делаете ему set(бла-бла-бла) и save.

Ковыряться в файле что бы сохранить только определенные поля - излишнее усложнение задачи.


aka ur6lad
 
 
Сообщения:2
Спасибо, Шкипер , за рекомендацию, сделал как вы сказали, но почему-то не помогает.
Не понимаю в чём дело, всё равно перетираются данные. Дебаг всё правильно показывает. Т.е. liveLogin2 - показывает корректное значение, которое было сохранено в файле, но в момент записи
prop.store(new FileOutputStream("config.properties"), null);
Записывается только значение, которое я установил set-ом, а всё остальное из файла стирается. В чём тут подвох?

Properties defaultProp = new Properties();
    try {
        defaultProp.load(new FileInputStream("config.properties"));
    } catch (IOException ex) {
        System.err.println("Properties file has not yet created");
    }
    Properties prop = new Properties(defaultProp);
    try {
        System.err.println("liveLogin=" + prop.getProperty("liveLogin"));

        //set the properties value
        prop.setProperty("liveUrl", urlTextField.getText());
        System.err.println("liveLogin2=" + prop.getProperty("liveLogin"));

        //save properties to project root folder
        prop.store(new FileOutputStream("config.properties"), null);
        
        setVisible(false);
        dispose();
    } catch (IOException ex) {
        ex.printStackTrace();
    } 
 
 
Сообщения:478
Andrey_yog:

Записывается только значение, которое я установил set-ом, а всё остальное из файла стирается. В чём тут подвох?

в том что созданный объект Properties содержит в себе ссылку на родительский, а не полностью копирует его. Родительский используется для получения значений по умолчанию, т.е. тех которые не определены в дочернем объекте:
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;


как видно, если sval отсутствует, то значение берется из родительского defaults.
дока

Выход: так как Properties наследует от HashTable (хотя это и неправильно :) ), забить значения из родительского объекта в дочерний вручную и сохранить.
 
 
Сообщения:2
Quote:
Родительский используется для получения значений по умолчанию, т.е. тех которые не определены в дочернем объекте:

Да, т.е. значения по умолчанию берутся из родительского. Т.е. должно работать так, как я и ожидаю: "sval отсутствует, то значение берется из родительского defaults".
Я наверное не понял вашей мысли, т.к. так и не понял почему значения которые реально были в файле и попали успешно в дочерний объект - при попытке записи - перетираются.
Quote:
забить значения из родительского объекта в дочерний вручную и сохранить.

- это конечно можно, но не красиво ведь ! :) И зачем тогда сделали возможность установки значений из родительского default ?
Спасибо
 
 
Сообщения:478
Andrey_yog:
не понял почему значения которые реально были в файле и попали успешно в дочерний объект - при попытке записи - перетираются.

он пишет в ФС только дочку, считая что родитель уже где-то сохранен, это позволяет создавать иерархии пропертей без избыточности.
 
 
Сообщения:20
Скажите, а есть ли возможность брать не значение по ключу, а и ключ, и значение?
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет