2008-12-02 2 views
98

Мне нужно прочитать файлы свойств, которые были захоронены в моей структуре упаковки в com.al.common.email.templates.Загрузка файла свойств из пакета Java

Я пробовал все, и я не могу понять это.

В конце мой код будет работать в контейнере сервлетов, но я не хочу зависеть от контейнера ни за что. Я пишу JUnit тестовые примеры, и он должен работать в обоих.

ответ

217

При загрузке свойств из класса в пакете com.al.common.email.templates вы можете использовать

Properties prop = new Properties(); 
InputStream in = getClass().getResourceAsStream("foo.properties"); 
prop.load(in); 
in.close(); 

(Добавить все необходимые обработки исключений).

Если ваш класс не в этом пакете, вам необходимо aquire в InputStream немного по-другому:

InputStream in = 
getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties"); 

Относительные пути (те, без «/») в getResource()/getResourceAsStream() означает, что ресурс будет поиск по отношению к каталогу, который представляет пакет, в котором находится класс.

Используя java.lang.String.class.getResource("foo.txt"), поиск файла (несуществующего) /java/lang/String/foo.txt в пути к классам.

Использование абсолютного пути (тот, который начинается с '/') означает, что текущий пакет игнорируется.

+0

я предполагаю, что второй фрагмент является ответом на вопрос .. – Satya 2008-12-02 08:58:00

+1

Предложение: Добавить объяснение, когда использовать относительны и когда использовать абсолютные пути (с и без «/» на начало). – 2008-12-02 09:06:35

+0

Я попытался дать некоторое объяснение. – 2008-12-02 09:13:26

2

Предполагая, что вы используете класс Properties, используя его метод load, и, я думаю, вы используете ClassLoader getResourceAsStream для получения входного потока.

Как вы переходящая в имени, кажется, что это должно быть в такой форме: /com/al/common/email/templates/foo.properties

42

Чтобы добавить в ответ Йоахима Зауэра, если вы когда-нибудь понадобится, чтобы сделать это в статическом контексте, вы можете сделать что-то вроде следующее:

static { 
    Properties prop = new Properties(); 
    InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties"); 
    prop.load(in); 
    in.close() 
} 

(обработка исключений опущены, как и раньше.)

9
public class Test{ 
    static { 
    loadProperties(); 
} 
    static Properties prop; 
    private static void loadProperties() { 
    prop = new Properties(); 
    InputStream in = Test.class 
      .getResourceAsStream("test.properties"); 
    try { 
     prop.load(in); 
     in.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
8
public class ReadPropertyDemo { 
    public static void main(String[] args) { 
     Properties properties = new Properties(); 

     try { 
      properties.load(new FileInputStream(
        "com/technicalkeeda/demo/application.properties")); 
      System.out.println("Domain :- " + properties.getProperty("domain")); 
      System.out.println("Website Age :- " 
        + properties.getProperty("website_age")); 
      System.out.println("Founder :- " + properties.getProperty("founder")); 

      // Display all the values in the form of key value 
      for (String key : properties.stringPropertyNames()) { 
       String value = properties.getProperty(key); 
       System.out.println("Key:- " + key + "Value:- " + value); 
      } 

     } catch (IOException e) { 
      System.out.println("Exception Occurred" + e.getMessage()); 
     } 

    } 
} 
13

Следующие два случая относятся к загрузке файла свойств из класса классов с именем TestLoadProperties.

Случай 1: Загрузка файла свойств с помощью ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader() 
          .getResourceAsStream("A.config"); 
properties.load(inputStream); 

В этом случае файл свойств должен находиться в каталоге root/src для успешной загрузки.

Случай 2: Загрузка файла свойств без использования ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config"); 
properties.load(inputStream); 

В этом случае файл свойств должен находиться в том же каталоге, что и файл TestLoadProperties.class для успешной загрузки.

Примечание:TestLoadProperties.java и TestLoadProperties.class - это два разных файла. Первый файл .java обычно находится в каталоге проекта src/, а последний, .class, обычно находится в его каталоге bin/.

-2

использовать следующий код пожалуйста:

 
    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/"); 
    path.append("foo.properties"); 
    InputStream fs = getClass().getClassLoader() 
            .getResourceAsStream(path.toString());

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
2

мне удалось решить эту проблему с этим вызовом

Properties props = PropertiesUtil.loadProperties("whatever.properties"); 

Extra, вы должны поместить ваши whatever.properties файл в/SRC/основные/ресурсы

0

Никто не упоминает подобное, но даже более простое решение, чем указано выше, без необходимости иметь дело с пакетом класса. Предполагая, что myfile.properties находится в пути к классам.

 Properties properties = new Properties(); 
     InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties"); 
     properties.load(in); 
     in.close(); 

Наслаждайтесь

Смежные вопросы