2013-11-13 4 views
1

Есть ли какой-то «родной» формат в java, который позволит мне написать файл данных, который затем я могу легко загрузить в Map<String, Collection<String>>? Я предпочел бы сделать это без необходимости комментировать какой-либо значительный синтаксический анализ. Это будет инициализация компонента с областью приложения, поэтому он запускается только один раз при запуске.Как загрузить карту <String, Collection <String>> из файла данных?

Я понимаю, что могу использовать JSON, а затем использовать что-то вроде GSON для загрузки данных, но это похоже на излишний избыток для чего-то, что казалось бы простым. Если бы у меня было закрытие, я мог бы создать его как файл свойств, использовать определенный разделитель для моей коллекции и иметь разбор замыкания на разделителе, но это не кажется очень изящным и, что самое главное, недоступно в Java 8.

Аналогично, я могу загрузить как простой файл свойств, а затем скопировать на карту, анализируя отдельные значения свойств, но снова кажется немного «взломанным».

Я мог бы использовать XML, а затем импортировать XML, но это способ перехитрить и, скорее, иметь простой текстовый формат, который легко понять.

Я не против использования чего-либо из Apache Commons или Guava и т. Д., Но пока ничего не нашел.

+3

Там нет такого понятия. Используйте стандартный формат, например JSON или XML. –

+1

Что касается комментария overkill: Да, JSON - это «overkill» для просто «String -> Collection ', но у вас скорее будет один формат для него, другой формат для списка строк, другой для списка ints, другой для карты «String -> String» и т. д.? – yshavit

+0

Почему XML overkill? Он напрямую поддерживается Java SE –

ответ

1

Мое мнение таково, что JSON легкий и простой, это представление в памяти - карта карт или массивов, похоже, подходит для работы. Это прочитал бы весь файл в Multimap (использует Jackson):

ObjectMapper mapper = new ObjectMapper(); 

Map<String, List<String>> map = mapper.readValue(inputStream, 
    new TypeReference<Map<String, Object>>() {}); 
1

Дайте SimpleXML выстрел. это смешно прост в использовании.

@Default 
Map<String, Collection<String>> somethingToPersist; 

.... 

Prersister persister = new Persister(); 
File file = new File("/file_path"); 
persister.write(somethingToPersist,file) 
+0

Никогда не слышал о SimpleXML раньше. Спасибо за ссылку. Моя проблема с любым XML, однако, заключается в том, что это очень много для чего-то такого простого. Кроме того, чтобы сделать это правильно, подразумевалось бы DTD или XSD-файл, что делает его еще более подробным. –

+0

@ Eric B.:XML может быть многословным, но для этого прецедента (сериализации/де-сериализации) вам не нужно даже смотреть на него, так что ... кого это волнует? – Dave

1

Если вы ОК с язычком, ведущей имеющие особое значение, я думаю, я бы отформатировать файл как:

key1 
    value1-a 
    value1-b 
key2 
    value2-a 
key3 
    value3-a 
    value3-b 
    value3-c 

Если вкладка ведущих означает строку является значение (не a ключ).

Затем анализатор:

public class MapBuilder 
{ 
    private final Map<String, Collection<String>> map; 
    private Collection<String> col; 

    public MapBuilder() 
    { 
     map = new LinkedHashMap<String, Collection<String>>(); 
    } 

    public Map<String, Collection<String>> getMap() 
    { 
     return map; 
    } 

    public void addLine(String line) 
    { 
     if (line.length() > 0) 
     { 
      if (line.charAt(0) == '\t') 
      { 
       if (col == null) 
       { 
        throw new IllegalArgumentException(
          "No key specified"); 
       } 
       col.add(line.substring(1)); 
      } 
      else 
      { 
       col = new ArrayList<String>(); 
       map.put(line, col); 
      } 
     } 
    } 

    public static Map<String, Collection<String>> getMap(File file, 
      Charset charset) throws IOException 
    { 
     MapBuilder mb = new MapBuilder(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(
       new FileInputStream(file), charset)); 
     try 
     { 
      String line; 
      while ((line = br.readLine()) != null) 
      { 
       mb.addLine(line); 
      } 
      return mb.getMap(); 
     } 
     finally 
     { 
      try 
      { 
       br.close(); 
      } 
      catch (Throwable t) 
      { 
       t.printStackTrace(); 
      } 
     } 
    } 
} 

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

Map<String, Collection<String>> myMap = MapBuilder.getMap(
     new File("C:/myfile.txt"), Charset.forName("US-ASCII")); 
+0

Полный кредит для творческого решения.Спасибо за усилия по написанию кода! Но я думаю, что буду пытаться придерживаться JSON и Jackson на этом этапе, а затем писать собственный парсер для всех целей и задач. После некоторого размышления я понял, что я уже создаю вывод JSON, поэтому мое приложение уже связано с Jackson. Я, скорее всего, просто использую ObjectMapper для загрузки форматированного файла JSON и сделаю это. –

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