Путь файла свойств в Java - PullRequest
8 голосов
/ 14 июля 2011

У меня есть файл свойств, который находится внутри пакета по умолчанию, и класс, в котором я использую файл свойств, также находится в том же пакете по умолчанию. Если я использую только имя файла без пути, я получаю ошибку. Очевидно, что это не правильно, так как я должен дать какой-то путь для ссылки на файл tat. Я создам приложение, сделав его в виде файла JAR, так как я должен указать путь, поскольку файл свойств должен находиться внутри этого файла JAR. Я использую Netbeans IDE.

EDIT

 Properties pro = new Properties();

    try {            
        pro.load(new FileInputStream("pos_config.properties"));
        pro.setProperty("pos_id", "2");
        pro.setProperty("shop_type", "2");
        pro.store(new FileOutputStream("pos_config.properties"), null);
        String pos_id = pro.getProperty("pos_id");
        if(pos_id.equals("")){
           pos_id="0" ;
        }
        global_variables.station_id = Integer.parseInt(pos_id);
        String shop_type = pro.getProperty("shop_type");
        if(shop_type.equals("")){
           shop_type="0" ;
        }
        global_variables.shop_type = Integer.parseInt(shop_type);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }

Ответы [ 6 ]

9 голосов
/ 14 июля 2011

Использование getClass().getResourceAsStream("foo.properties")

Но учтите, что использование пакета по умолчанию не рекомендуется (вышеуказанное будет работать с любым пакетом).

Ваш код не работает, потому что FileInputStream(..) использует пути относительно текущего каталога пользователя (см. Документацию java.io.File). Так выглядит foo.properties в /home/usr/ или c:\documents and settings\usr. Поскольку ваш файл .properties находится в пути к классам, вы можете прочитать его как таковой - через метод Class.getResourceAsStream(..).

6 голосов
/ 14 июля 2011

Как уже указывали другие, вы должны загружать его из пути к классам, а не в виде файла, если вы хотите иметь возможность загрузить его из фляги. Вам нужен метод Class.getResourceAsStream () или метод ClassLoader.getResourceAsStream () . Однако использование getClass().getResourceAsStream("pos_config.properties") опасно, потому что вы используете путь, который разрешен относительно данного класса, а подкласс может изменить местоположение, в котором он разрешен. Поэтому безопаснее назвать абсолютный путь в банке:

getClass().getResourceAsStream("/pos_config.properties")

или даже лучше, используйте литерал класса вместо getClass ():

Foo.class.getResourceAsStream("pos_config.properties")
5 голосов
/ 14 июля 2011

Вы пытаетесь получить файл свойств из текущего рабочего каталога или пытаетесь получить его как ресурс? Похоже, вы должны использовать.

InputStream is = getClass().getResourceAsStream(filename);
properties.load(is);

для загрузки файла из текущего каталога

properties.load(new FileInputStream(filename));

Я думаю, что вы действительно хотите это.

try {            
    Properties pro = new Properties();
    pro.load(new FileInputStream("pos_config.properties"));
    String pos_id = pro.getProperty("pos_id");
    try {
        global_variables.station_id = Integer.parseInt(pos_id);
    } catch(Exception e) {
        global_variables.station_id = 0;
    }
    String shop_type = pro.getProperty("shop_type");
    try {
        global_variables.shop_type = Integer.parseInt(shop_type);
    } catch(Exception e) {
        global_variables.shop_type = 0;
    }
} catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
3 голосов
/ 14 июля 2011

В любом случае, я бы рекомендовал поместить все файлы свойств в папку ресурсов.

В Eclipse вы можете создать исходную папку с:

Щелкните правой кнопкой мыши -> новый -> Исходная папка

Бьюсь об заклад, есть что-то подобное в Netbeans. Поместите туда весь свой файл собственности. Позже вы можете получить к ним доступ с помощью следующего кода:

AnyClass.class.getResource("/image.png")

Таким образом, для вашей конкретной проблемы вы должны получить к ней следующий доступ:

pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties")));
2 голосов
/ 19 марта 2014

В статическом методе я использую

ClassLoader.getSystemResourceAsStream ("name.properties");

0 голосов
/ 06 февраля 2014

Это не скомпилируется:

pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties")));

Правильное использование:

pro.load(YourClass.class.getResourceAsStream("/pos_config.properties")));
...