![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток. Попытался написать программку-архиватор, которая ищет в каталоге определенные файлы и пакует их в архив. Для архивации использую zip4j. Для лучшего усвоения кодирования в стиле java8 попытался использовать максимальное количество известных мне фич: функциональный интерфейс, стримы, лямбды и пр:
Здесь мне не нравится то, что я создаю 2 стрима - для поиска вложенных каталогов и для архивирования. Из-за этого программка работает медленнее, чем такая же, но в стиле java7. Может, посоветуете, как тут можно обойтись 1 стримом, ну и вообще улучшить код? Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Kircul |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
1. Не понял зачем распаралеливать поток (stream) файлов fb2 если потом все равно вся обработка (самая затратная операция) проходит в один поток (thread).
2. Похожая проблема со вторым потоком (stream) (директорий). Может делать в один поток (thread) и не вызывая collect запускать FilesArchiver.compute прямо в потоке (stream)? В общем не вижу смысла играться с многопоточностью (thread) когда алгоритм по сути однопоточен (если я конечно правильно его понял). А можно увидеть код в java 7 стиле? Для сравнения... Updated: добавил пояснение к словам "поток", где я подразумеваю stream а где thread. Это сообщение отредактировал(а) Kircul - 3.6.2014, 01:28 |
|||
|
||||
| Kircul |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
И вот еще забыл, фильтровать файлы лучше при вызове метода listFiles
У меня нет под рукой компилятора java 8, по этому не гарантирую работу, но выглядеть должно как-то так:
Это сообщение отредактировал(а) Kircul - 3.6.2014, 04:00 |
|||
|
||||
| Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Вот он:
я использую fork / join, так что происходит параллельный рекурсивный поиск файлов по всему каталогу и подкатологам и их упаковка несколькими thread'ами. Поэтому, кстати, и использую локер - чтобы, пока один thread пишет в архив, остальные его в это время не трогали, т. к. класс ZipFile is not Thread safety. Красиво! Только не ясны 2 момента: 1)
в конструктор FilesArchiver'a у меня передаётся аргумент - строка с путём к к аталогу, в котором надо искать файлы для архивирования. Она что же, автоматически туда попадёт после
2)
эта строка у меня не компилится: пишет, что не может найти метод collect. Я так понимаю, что ссылки на методы работают, если эти методы в классе есть, но в FilesArchiver'e нет метода collect. Его нужно создать? -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
| Kircul |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
Нет. "listFiles" однопоточен, само архивирование тоже. А то что фильтрация элементов в списке проводится в несколько потоков может вовсе и не ускорять выполение алгоритма. Советую попробовать для сравнения однопоточный вариант (который я описал выше) и по профайлить.
Описка, я имел в виду метод compute.
http://docs.oracle.com/javase/8/docs/api/j...ction.Function- По сути:
эквивалентно:
Пруф: http://hg.openjdk.java.net/lambda/lambda/j...nction.java#l86 |
||||||||||
|
|||||||||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Действительно, работает не быстрее, чем ваш вариант. Интересно было бы попробовать заархивировать тысяч 5 файлов - для сравнения... В любом случае, спасибо за ответы и разъяснения! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |