getSystemResourceAsStream () возвращает ноль - PullRequest
7 голосов
/ 26 марта 2010

Hiii ... Я хочу получить содержимое файла свойств в объект класса InputStream с помощью getSystemResourceAsStream (). Я построил пример кода. Он хорошо работает с помощью метода main (), но когда я разверну проект и запустлю на сервере, путь к файлу свойств не может быть получен ... поэтому объект inputtream хранит нулевое значение.

Пример кода здесь ..

public class ReadPropertyFromFile {

    public static Logger logger = Logger.getLogger(ReadPropertyFromFile.class);

    public static String readProperty(String fileName, String propertyName) {
        String value = null;
        try {
            //fileName = "api.properties";
            //propertyName = "api_loginid";

            System.out.println("11111111...In the read proprty file.....");


            //  ClassLoader loader = ClassLoader.getSystemClassLoader();

            InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName);

            System.out.println("In the read proprty file.....");
            System.out.println("File Name :" + fileName);
            System.out.println("instream = "+inStream);

            Properties prop = new Properties();

            try {
                prop.load(inStream);
                value = prop.getProperty(propertyName);
            } catch (Exception e) {
                logger.warn("Error occured while reading property " + propertyName + " = ", e);
                return null;
            }
        } catch (Exception e) {
            System.out.println("Exception = " + e);
        }
        return value;
    }

    public static void main(String args[]) {

      System.out.println("prop value = " + ReadPropertyFromFile.readProperty("api.properties", "api_loginid"));
   }
}

Ответы [ 3 ]

15 голосов
/ 26 марта 2010

Я развернул проект и запустил на сервере,

Это звучит как веб-приложение JSP / Servlet. В этом случае вам нужно использовать ClassLoader, который получается следующим образом:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

У этого есть доступ к всем путям пути к классам, связанным с рассматриваемым веб-приложением, и вы больше не зависите от того, какой родительский загрузчик классов (веб-приложение имеет более одного!) Загрузил ваш класс.

Затем в этом загрузчике классов вам нужно просто вызвать getResourceAsStream(), чтобы получить ресурс classpath в виде потока, а не getSystemResourceAsStream(), который зависит от того, как запускается веб-приложение. Вы также не хотите зависеть от этого, поскольку у вас нет контроля над ним на внешнем хостинге:

InputStream input = classLoader.getResourceAsStream("filename.extension");

Это, наконец, более надежно, чем ваш первоначальный getSystemResourceAsStream() подход и Class#getResourceAsStream(), как предлагали другие.

6 голосов
/ 26 марта 2010

SystemClassLoader загружает ресурсы из java.class.path, которые отображаются в системную переменную CLASSPATH. В локальном приложении у вас, вероятно, есть ресурс, который вы пытаетесь загрузить, настроенный в переменной java.class.path. На сервере это другая история, потому что, скорее всего, сервер загружает ваши ресурсы из другого загрузчика классов.

Попробуйте использовать ClassLoader, который загружал класс, используя правильный путь:

getClass().getResourceAsStream(fileName);

Эта статья также может быть полезна.

1 голос
/ 26 марта 2010

Попробуйте использовать getResourceAsStream() вместо getSystemResourceAsStream ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...