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

    +83

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    // java.io.FilterOutputStream
    public void close() throws IOException {
        try {
            flush();
        } catch (IOException ignored) {
        }
        out.close();
    }
    
    // тестовый код
    try (OutputStream os = new BufferedOutputStream(new FileOutputStream("/tmp/little_virtual_fs/1.txt"))) {
        byte[] buf = new byte[2028544];
        os.write(buf, 0, 2028544); // максимальный размер файла, который влезает на нашу фс
        os.write(buf, 0, 5); // и еще немножко
        //os.flush();
    }

    А сейчас, на арене нашего цирка - очередная жабопроблема!

    Как думаете, каков результат выполнения тестовой программы?

    Запишет 2028549 байт? Хрен там, места маловато.
    Выдаст IOException на write()? Хрен там, буферизация.
    Выдаст IOException на close()? Хрен там, его сожрала реализация FilterOutputStream.

    Результат: файл не дописался, исключения нет.
    Решение: всегда дергать flush() перед close() самому или не юзать буферизованный поток.

    Запостил: bormand, 21 Декабря 2013

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

    • Ответить
      • Это был комментарий для привлечения просматривающих сток?
        Ответить
        • Это же очевидно
          Ответить
        • Да нет, написал комментарий, подумал, что он спорный, и убрал его.
          Ответить
        • Хорошая идея.
          Ответить
          • В терминах аиб называется автобамп. Бампнуть и уд0лить коммент.
            Ответить
            • Не везде можно удалять.
              Ответить
            • Кстати отредактированные коменты в стоке не отображается.
              Ответить
              • Отображаются. Там просто алгоритм обновления неясен. Если быстро поправить - видно изменения. Если долго тупишь - перестает обновляться, пока кто-то не напишет еще один коммент.
                Ответить
      • os.write(buf, 0, 2028544); 
        os.flush();  
        os.write(buf, 0, 5);

        должно работать, наверное, но могу и ошибаться. а то что не выдает IOException это конечно попа.
        Ответить
        • > должно работать, наверное
          flush() прямо перед close() или автозакрытием все равно обязателен, иначе BufferedOutputStream.close() сделает его сам, и сожрет исключение.
          Ответить
      • Кто плюсует пустые комменты?!
        Ответить
    • http://bugs.sun.com/view_bug.do?bug_id=6335274
      Ответить
      • ну жаба уже давно начала напоминать разработку под винапи: знать либы и функциональность не так важно, как знать где грабли разложены. и дезайн с самого начала в обход этих граблей делать.

        но до уровня виндов жабе еще далековато.
        Ответить
        • > но до уровня виндов жабе еще далековато.
          да такая же обратная совместимость со старыми граблями
          Ответить
        • >не так важно, как знать где грабли разложены.
          Охблядь. Я думал о чем угодно, но не об этом. Я думал питон с его возвратом пустой строки вместо исключения при чтения из потока - унаследованный кал, но и жавку не обошла хуйня сия.
          Ответить
          • У жабы дурное наследие. Ибо одна из первых пошла она по этому тернистому пути
            Ответить
            • По какому? А в питоне тупо сишное наследие вроде вышеуказанного конца потока или заумное соединение по tcp (несколько вызовов вместо одного универсального конструктора как в перле). Местами тупо склонировали сишное апи.

              В жавке мне нравилось, что она не тупо копивала апи какой-то оси, соответственно не знакомые с этой осью чувствуют себя объебками.
              Ответить
              • это вам не пхп, там больше строк для хелловорда писать надо
                Ответить
                • Да, для скрипта на 5 строк больше подходят динамические языки. Пост выше это не отменяет.
                  Ответить
    • Флюш-Флюш!
      Ответить
      • Чисти, чисти сука. Вот как, блядь, нужно чистить, вот, быстро.
        Ответить
        • Помню первый раз столкнулся с flush() в openGL в С#. Спросил у человека - мол что делает эта функция, а мне в ответ "Ну это такая функция... Она ничего не делает, но все остальное работает быстрее". Оккультное программирование
          Ответить
    • Жаваёбы соснули.

      Resolution: Won't Fix

      Жаваёбы дважды соснули.
      Ответить
    • Кстати, BufferedWriter не проглатывает исключение, в отличие от BufferedOutputStream.
      Ответить
    • > всегда дергать flush() перед close()
      одна из заповедей жабокодера

      кстати, флашить нужно еще и всякие там EntityManager'ы
      Ответить
    • > 2028544
      А почему размер такой магический?
      Ответить
      • А х.з. Столько входило на эту файловую систему (ext2 поверх файлика, созданного через dd -bs 1K -count 2K).
        Ответить
        • Через квоты на ntfs повторяется?
          Ответить
          • Х.з. скорее всего должно. На крайний случай можно просто флешку забить до отказа, и оставить на ней пару метров. Но я чет не вижу особого смысла в повторении этого эксперимента, т.к. и так понятно, что на любой оси исключение сожрется.
            Ответить
            • Чтобы ткнуть жаваёбов туда ебальником в холиворе.
              Ответить
              • Ну кидай им ссылку на баг. Где-то выше я ее тут приводил. Там есть код, которым он воспроизводится. Ну и ответ sun'а.
                Ответить

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