Загрузить много файлов свойств из одного текстового файла и вставить в LinkedHashMap - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть файл, который содержит множество файлов свойств, строка за строкой может быть около 1000, и каждый файл свойств будет иметь около 5000 пар ключ-значение. Например: - Пример примера (abc.txt) -

abc1.properties
abc2.properties
abc3.properties
abc4.properties
abc5.properties

Итак, я открываю этот файл и, когда он читает каждую строку, я загружаю файл свойств в методе loadProperties. И сохранение пары ключ-значение из этого свойства в LinkedHashMap.

public class Project {
    public static HashMap<String, String> hashMap;

    public static void main(String[] args) {
        BufferedReader br = null;
        hashMap = new LinkedHashMap<String, String>();
        try {
            br = new BufferedReader(new FileReader("C:\\apps\\apache\\tomcat7\\webapps\\examples\\WEB-INF\\classes\\abc.txt"));
            String line = null;
            while ((line = br.readLine()) != null) {
                loadProperties(line);//loads abc1.properties first time
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
//I am loading each property file in this method. And checking whether the key 
already exists in the hashMap if it exists in the hashMap then concatenate the
new key value  with the previous key value. And keep on doing everytime you 
find key exists.

    private static void loadProperties(String line) {
        Properties prop = new Properties();
        InputStream in = Project.class.getResourceAsStream(line);
        String value = null;
        try {
            prop.load(in);
            for(Object str: prop.keySet()) {
                if(hashMap.containsKey(str.toString())) {
                    StringBuilder sb = new StringBuilder().append(hashMap.get(str)).append("-").append(prop.getProperty((String) str));
                    hashMap.put(str.toString(), sb.toString());
                } else {
                    value = prop.getProperty((String) str);
                    hashMap.put(str.toString(), value);
                    System.out.println(str+" - "+value);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }

}

Итак, у меня вопрос: у меня более 1000 файлов свойств, а в каждом файле свойств - более 5000 пар ключ-значение. И большинство файлов свойств имеют один и тот же ключ, но с разными значениями, поэтому я должен объединить значение с предыдущим значением, если ключ такой же. Есть ли какие-либо ограничения по размеру с LinkedHashMap, так как файл свойств продолжает увеличиваться, а также пара ключ-значение в файле свойств. То есть этот код достаточно оптимизирован для решения подобных проблем?

1 Ответ

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

Карта не имеет никаких ограничений, кроме размера кучи памяти, выделенной для вашей JVM, и может управлять с помощью опции -Xmx

Ваш код в порядке с точки зрения производительности.

Но я могу предложить следующие улучшения.

  1. Избегайте использования hashMap.containsKey(str.toString()), а затем hashMap.get(str). containsKey(key) реализован как return get(key) != null, поэтому вы на самом деле вызываете get() дважды. Вместо этого вы можете сказать что-то вроде следующего:

    значение = map.get (ключ); if (значение! = ноль) { значение + = стр .; } map.put (ключ, значение);

  2. Не звоните str.toString(). Этот вызов просто создает еще один экземпляр String, равный исходному. Поскольку класс Properties не параметризован, используйте вместо этого приведение типов, т.е. (String)str.

  3. Если у вас все еще есть проблемы с производительностью, вы можете сначала объединить все файлы свойств, а затем загрузить их, используя один раз Properties.load(). Возможно, вы получите некоторые преимущества в производительности.

...