Jawa / Говнокод #11354 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
reader = new BufferedReader(new FileReader(file));
//null means file end
while ((tempString = reader.readLine()) != null) {
    if(tempString !=null && tempString.indexOf('=')>0){
        sheet.addCell(new Label(KEY_COLUMN,++ROW, tempString.substring(0,tempString.indexOf('='))));
        sheet.addCell(new Label(ENGLISH_COLUMN,ROW, tempString.substring(tempString.indexOf('=')+1)));
    }
}
reader.close();

Вот так мы парсим файл *.properties в Java.

Запостил: roman-kashitsyn roman-kashitsyn, (Updated )

Комментарии (31) RSS

  • AWT? ой ё.
    да еще и отображение сразу при чтении.
    а вот substring лучше чем split
    Ответить
  • Вполне нормальный парсинг даже как для какого-то проекта.
    Ну подумаешь reader.close(); не в finally
    За исключением того, что это велосипед.
    Ответить
      • >хуевый парсинг
        По меркам говнокода - да. Типа расчитано на то пока все пишут так
        a=b
        c=d
        В реальных проектах я и похуже видел:
        Вместо tempString.indexOf('something') было магическое число
        tempString.substring(MAGIC_NUMBER_VALUE)

        Потому это относительно нормальный парсинг. И в любом случае - говно, только потому что велосипед.
        Ответить
        • > tempString.substring(MAGIC_NUMBER_VALUE)
          Зато в файле ровные колонки.
          Ответить
          • Неа. Так поцоны так отрезали хедер у xml-я:
            <?xml version="1.0" encoding="UTF-8"?>
            xml.substring(38)
            Код так и работает до сих пор.
            Ответить
              • Там вообще не надо было ничего парсить. Нужно было юзать xslt.
                Решение говнозадачи говносредствами.
                Ответить
                • XSLT то еще говно... Но, согласен, лучше он, чем велосипеды.
                  Ответить
    • И тут нам попадается файл следующего содержания:
      # = (equals signs) are used to delimit property names and values
      # for example: foo = bar, or foo=bar etc.
      # backslash is used to escape the following line end character, for example:
      foo = long text \
            more long text
      Ответить
      • Вот вот, знак = может встретиться в комментах, кроме того, это не единственный символ, которым можно разделять проперти. Неужели так сложно
        Properties props = new Properties();
        props.load(new BufferedInputStream(new FileInputStream(file)));
        Ответить
        • Не айс. Лучше InputStreamReader с явным указанием кодировки.
          Ответить
          • Вообще проперти должны всегда быть в ASCII, а символы > 127 должны быть представлены в виде \uxxxx. Но в реальном мире ваш вариант лучше.
            Ответить
            • Что значит должны быть?

              То, что сантехники когда-то ниасилили Юникод - не аргумент. Класс Properties сто лет как поддерживает указание кодировки.

              А то, что эти файлы с кем-то там в сферическом вакууме будут несовместимы - ну и шут с ними. Мы же их для себя пишем. Геморрой с native2ascii - прошлый век.

              Вот GWT вообще требует, чтобы .properties были в UTF-8.
              Ответить
                • Вообще странно, что это ещё не deprecated.

                  Во всём JDK уже почти все методы, которые перекодируют байтовые последовательности в символьные без указания кодировки, помечены как deprecated.

                  Ну, остался ещё FileReader, последний из могикан.

                  И почему 1.4.2? Где вы откопали такое говно мамонта?
                  Ответить
                  • Кстати, дефолтные бандлы вроде бы тоже требуют именно таких условий, а код написан для работы с файлами локализации, которые этими самыми бандлами цепляются.
                    Ответить
        • >FileInputStream
          А оно неявно закрывается?
          Я уже давно написал себе небольшой статик-метод.
          public static Properties readProperties(InputStream input) 
          	{
          		try{
          			Properties propMap = new Properties();
          			propMap.load(input);
          			return propMap;
          		}catch (IOException io){
                              throw new RuntimeException(io)
          		}finally{
          		      tryToClose(input);
          		}
          	}
          Ответить
            • Придётся изобразить Капитана: close может зафейлиться!
              Ответить
                • Кстати, а почему close() вообще может зафейлиться? Если не сможет выфлушить остатки данных на диск, например потому, что закончилось место? Других причин что-то не могу представить.
                  Ответить
                  • >Not checking the return value when closing the file may lead to silent loss of data. This can especially be observed with NFS and with disk quota.
                    Ответить
            • Делать throw из finally - как минимум некошерно, особенно когда файл считан и сработал return propMap;
              Потому пробуем закрыть input, где душим исключение, но пишем его в лог.
              Ответить
  • ну хотя б использовали str.split('=', 2) - и то уже бы лучше было
    Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8