Загрузка файла свойств, читая построчно из другого файла - PullRequest
3 голосов
/ 21 ноября 2011

Я читаю файл с именем abc.txt, и каждая строка abc.txt является файлом свойств. Например: -

label.properties
label_ch.properties
label_da.properties
label_de.properties
label_en.properties

Итак, после прочтения каждой строки я получаю файл свойств в строке String, и после этого я пытаюсь загрузить этот файл свойств, но он не загружается. Что-то не так с моей реализацией?

Это мой код -

package testing.project;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Properties;

public class Project {

    public static void main(String[] args) {
    BufferedReader br = null;
    HashMap<String, String> hashMap = new LinkedHashMap<String, String>();
    try {
        br = new BufferedReader(new FileReader("C:\\apps\\apache\\tomcat7\\webapps\\examples\\WEB-INF\\classes\\abc.txt"));
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        loadProperties(line);

        while (br.readLine() != null) {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        String everything = sb.toString();
        System.out.println(everything);
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
     catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    }

    private static void loadProperties(String line) {
        Properties prop = new Properties();
        InputStream in = Project.class.getResourceAsStream(line);
        try {
//As soon as it gets into prop.load(in), cursor goes to br.close that is in main method.
                prop.load(in);
                for(Object str: prop.keySet()) {
                    Object value = prop.getProperty((String) str);
                    System.out.println(str+" - "+value);
                }
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }

    }

Я получаю сообщение об ошибке -

Exception in thread "main" java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Unknown Source)
    at java.util.Properties.load0(Unknown Source)

Ответы [ 4 ]

4 голосов
/ 21 ноября 2011

Проходя через ваш код, кажется, что все хорошо, кроме упомянутых выше.Вместо написания

    String line = br.readLine();
    loadProperties(line);

    while (br.readLine() != null) {
        sb.append(line);
        sb.append("\n");
        line = br.readLine();
    }

предпочитайте писать

String line = null;
while ((line = br.readLine()) != null) 
{
    loadProperties(line);
    sb.append(line);
    sb.append("\n");
    line = br.readLine();
}

Более того, поскольку это Java-код, поэтому предпочитайте ставить косую черту (/) вместо двух обратных косых черт (\)описание пути к файлу.

Например:

BufferedReader br = new BufferedReader(new FileReader("C:/Apache/tomcat/webapps/GaganIsOnline/WEB-INF/classes/names.txt"));

И, пожалуйста, проверьте, правильно ли указан путь к файлу, то есть существует ли указанный файл abc.txt.в данном месте.

С уважением.

1 голос
/ 28 ноября 2011

Как только вы исправили ошибку, упомянутую выше.Вот решение проблемы:

enum PathType {RESOURCE, ABSOLUTE}

private static void loadProperties(String line, PathType pathType) {
    Properties prop = new Properties();
    InputStream in = null;
    if (pathType == PathType.RESOURCE)
        in = PropertyTest.class.getResourceAsStream(line);
    else {
        try {
            in = new FileInputStream(line);
        } catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    try {
//As soon as it gets into prop.load(in), cursor goes to br.close that is in main method.
        prop.load(in);
        for (Object str : prop.keySet()) {
            Object value = prop.getProperty((String) str);
            System.out.println(str + " - " + value);
        }
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Код для его вызова.Существуют различные способы.

  • Если вы хотите загрузить свойства из базы загрузчика классов.Например, если я запускаю свое приложение с функцией main из eclipse, моя база будет <some_path>/classes.Таким образом, файл label.properties находится там.Также, если вы работаете с Tomcat и label.properties лежит в <your_web_app>/classes.Используйте код ниже:

    loadProperties("/" + line, PathType.RESOURCE); // Load from base path of class loader

  • Если вы хотите загрузить свойства из папки пакета загрузчика классов.Например, если я запускаю свое приложение с функцией main из eclipse, моя база будет <some_path>/classes.Файл label.properties находится в <some_path>/classes/testing/project.Также, если вы работаете из Tomcat и label.properties лежит в <your_web_app>/classes/testing/project, используйте следующий код:

    loadProperties(line, PathType.RESOURCE); // Load from base path of class loader + the package path

  • Если вы хотите загрузить свойства из любого абсолютного путина вашем жестком диске.Используйте следующий код:

    loadProperties("C:\\apps\\apache\\tomcat7\\webapps\\examples\\WEB-INF\\classes\\" + line, PathType.ABSOLUTE);

ПРИМЕЧАНИЕ. Пожалуйста, обработайте исключение в соответствии с вашими потребностями.Я только что обновил ваш код как есть.

1 голос
/ 21 ноября 2011

РЕДАКТИРОВАТЬ: если вы получаете NullPointerException в пределах prop.load(in), вполне возможно, что

Project.class.getResourceAsStream(line)

возвращает ноль.Вы должны проверить это (а также закрыть входной поток в блоке finally).Вы уверены, что label.properties действительно присутствует и доступен для загрузчика классов?Как у вас работает этот код?Если вы используете Eclipse или что-то подобное, вы, возможно, забыли сообщить ему, что ваш файл label.properties является ресурсом, который следует скопировать в выходной каталог.


Что ж, вот одна проблема:

while (br.readLine() != null) {
    sb.append(line);
    sb.append("\n");
    line = br.readLine();
}

Это будет пропускать все остальные строки.Обычно я использую:

while ((line = br.readLine()) != null) {
    sb.append(line);
    sb.append("\n");
}

Обратите внимание, что только строка первая вашего файла используется для загрузки файла свойств - остальное просто сбрасывается в System.out.Кроме того, файл свойств, который вы загружаете , затем удаляется - вы ничего не делаете с prop впоследствии.(И вы должны закрыть in в finally блоке, предполагая, что он не равен нулю.)

0 голосов
/ 21 ноября 2011

Метод br.readLine() вызывается дважды в вашем коде.

 while (line != null) {
   loadProperties(line);
   sb.append(line);
   sb.append("\n");
   line = br.readLine();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...