1. Java / Говнокод #11354

    +74

    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, 03 Июля 2012

    Комментарии (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)
              Код так и работает до сих пор.
              Ответить
              • А зачем они на яве решили попарсить XML вручную?
                Ответить
                • Там вообще не надо было ничего парсить. Нужно было юзать 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.
                Ответить
                • Значит это лишь то, что подразумевает загрузка из потока:
                  http://tinyurl.com/choorsq
                  Ответить
                  • Вообще странно, что это ещё не deprecated.

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

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

                    И почему 1.4.2? Где вы откопали такое говно мамонта?
                    Ответить
                    • > И почему 1.4.2
                      а где упоминается 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);
            		}
            	}
            Ответить
            • а почему tryToClose?
              Ответить
              • Придётся изобразить Капитана: 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) - и то уже бы лучше было
      Ответить

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