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

    −46

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    public static byte[] zipAndEncodeToBase64(String filePath) {
            File fi = new File(filePath);
            byte[] bytesFromFile = safeGetBytesFromFileByName(filePath);
            return compressBytesToZip(bytesFromFile, fi.getName());
        }
    
        public static byte[] safeGetBytesFromFileByName(String fileName) {
            File thisFile = new File(fileName);
            StringBuffer stringBufferFromFile = safeGetFileAsStringBuffer(thisFile);
            return stringBufferFromFile.toString().getBytes();
        }
    
        public static byte[] compressBytesToZip(byte[] bytes, String fileName) {
            ByteArrayBuffer bab = saveFileAsZipArchive(bytes, fileName);
            return bab.getRawData();
        }
    
        public static StringBuffer safeGetFileAsStringBuffer(File file) {
            StringBuffer sb = new StringBuffer();
            try {
                FileReader reader = new FileReader(file);
                int c = 0;
                while ((c = reader.read()) != -1) {
                    sb.append(Character.getNumericValue(c));
                }
                reader.close();
            } catch (IOException e) {
                System.err.println(e.getMessage());
            }
            return sb;
        }

    Читаем бинарный файл и zipуем его. Падало по нехватке памяти в хипе на файле в 8 мб.

    Запостил: Landing, 28 Октября 2015

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

    • Вот что бывает, когда программист привык, что за памятью следит GC...
      Ответить
    • try {
                  FileReader reader = new FileReader(file);
      [...]
                  reader.close();
      }catch{
      Ответить
    • Добавлю.
      1. static методы, которые явно не самостоятельны, т.е. использовать их в отдельности нельзя, они друг от друга зависят.
      2. Читаем не текстовый файл а любой (текстовый или бинарный, так описано в тех. задании), но FileReader'ом, предназначенным для чтения текста.
      3. Читаем посимвольно (код символа), повторюсь в НЕ текстовом файле. Переводим код символа в char. Работает архимедленно. На выходе хз что. Обратно в файл полученный набор не соберется.
      4. Прочитали бинарый файл, как текст, обратно сконвертировали текст в массив байт. Без комментариев.
      5. Методов достаточно оставить 2. Первый читает файл. Второй zipует и конвертит в Base64. Иначе выходит то, что выше. Тусование из метода в метод имени файла. Много букв, мало толку, много проблем.
      Ответить
      • > Первый читает файл. Второй zipует и конвертит в Base64.
        По-хорошему надо вообще фильтрами на стримах, чтобы в константном объёме памяти файлы любого размера обрабатывать... Загружать файлы целиком в память - моветон, который работает только если файлики маленькие или памяти много...
        Ответить
    • родина дала им кондуиты и пайпы, буферизуй, буферизуй ввод
      не хочу, хочу читать всё в память
      Ответить
      • не, ну так а че оно само не читается, а? че это я все должен думать, а? Хуйня все эти ваши пайпы и кококо
        Ответить

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