Недавно я предъявляю требование: загрузите файл, храня URL -адрес изображения из каталога FTP других систем, затем прочитайте адрес URL в файле, загрузите изображение в соответствии с адресом и сжатие в пакет в день. В среднем один файл адреса содержит около 4000 адресов. То есть после сканирования файла вам нужно скачать около 4000 картин, а затем сжать его. Следующие записывают мой метод реализации и процесс оптимизации. Если у вас есть какие -либо лучшие способы, вы можете поделиться им.
Используется структура: Springmvc
Временная реализация задачи: наследство org.springframework.scheduling.quartz.quartzjobbean;
Я не буду говорить о строительстве среды FTP. Я записал его в других блогах, которые я использую службу FTP, созданную CentOS в виртуальной машине для создания учетной записи FTP и соответствующего каталога, и загружать файл адреса изображения, который необходимо загрузить заранее. Формат содержимого файла "Идентификатор изображения || Адрес изображения".
Метод 1. Самый простой способ реализовать это сначала загрузить файл, в котором хранится URL -адрес картин, затем прочитайте файл, пройдя адрес изображения, отрегулируйте загруженный метод изображения для хранения изображения локально, и, наконец, сжатие загруженного изображения. После завершения удалите загруженную картинку и сохраните только сжатый пакет.
открытый класс PictUreTransferJob Extends QuartzJobbean {Protected void ExecuteInternal (JobExeCutectOntext arg0) Throws JobExecutionException {// Фактическая конфигурация FTP получается путем чтения файла конфигурации // FTP -адреса string hostname = "192.168.112"; // порт FTP int port = 2001; /FTP -учетная запись string username = "test1"; // ftp пароль String password = "test1"; // FTP -файл хранилище хранилище string ftpdowload = "/"; // локальный путь хранилища пути строки файла = this.getClass (). GetResource ("/"). GetPath (); // Строка каталога хранилища файла адреса изображения addrpath = path.substring (1, path.indexof ("web-inf/class"))+"picaddr"; // Фактическая загруженная строка каталогов хранилища изображений picpath = path.substring (1, path.indexof ("web-inf/class"))+"pic"; addrpath = addrpath.replace ("%20", ""); picpath = picpath.replace ("%20", ""); try {// создать файл createfile (addrpath); // Создать файл CreateFile (PicPath); String oldaddrpath = addrpath; String OldPicPath = picpath; // Создать соединение ftp ftputil2 ftputil2 = new ftputil2 (имя хоста, порт, имя пользователя, пароль, ftpdowload, true); // Трансф файл в строке каталога FTP [] files = ftputil2.listallfiles (); // локальная база данных будет иметь таблицу записи загруженных файлов. Здесь мы будем запросить базу данных и имена файлов, перечисленные в FTP. Если загруженные файлы не будут загружены, и избегайте повторяющихся загрузок. // Процесс сравнения опущен ниже, зацикливайте массив файлов и создайте файл локально для (int i = 0; i <files.length; i ++) {createfile (addrpath+file.separator+filename); // ftpdowload - это адрес FTP -сервера. // метод для чтения файла после успешного загруженного файла, а адрес загруженного изображения хранится в контейнере Boolean EntityState = setPictureTetail (addrPath, Picpath, FilenAteate); }} catch (Exception e) {e.printstackTrace (); // Нажмите на бизнес -класс, который записывает журнал ошибок для отправки текстовых сообщений, которые загружают ошибки файлов}} // начало читать адрес изображения здесь Private Boolean SetPictureDetail (String AddRPath, String Picpath, String Syndate) { System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- String row; int count = 0; addrmap.put (Calcd [0] .trim (), Calce [1] .trim ()); System.out.println (New Date ()); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- e.printstacktrace ();}}} / *** picaddr = null; Byte Array через InputStream и потеряет данные, в результате чего неполные загруженные изображения. Byte Array, и после чтения в потоке данные PIC = новый файл (PICPATH+FILEN is.close (); ZIPPIC (PICPATH, SYNCDATE, ADDRMAP); {// Пауза в списке файлов, которые необходимо сжать, и сжатое имя файла Ziputil.zipbystream (Piclist, новый файл (Picpath+Syndate+". Zip")); if (! file.exists ()) {file.mkdirs (); Метод 2: многопоточная загрузка, прямое сжатие потоков
Метод 1 Несмотря на то, что основные функции реализованы, потому что есть слишком много изображений, которые необходимо загрузить, а сжатие локальных файлов изображений и удаления изображений также требует много времени, поэтому есть два места, где вы можете оптимизировать скорость. Одним из них является повышение эффективности загрузки изображений, а другой - повысить эффективность сжатия.
Метод повышения эффективности загрузки может использовать многопоточные загрузки, а метод повышения эффективности сжатия может напрямую сжимать поток файлов без сохранения изображения локально.
Метод реализации многопоточного внедрения: Во-первых, мы сохраняем список адресов файлов, которые необходимо загрузить. Если мы хотим использовать многопоточное для загрузки, мы должны убедиться, что картинки, загруженные различными потоками, не будут повторяться. Следовательно, флаг необходим для их различения. В настоящее время мы можем использовать индексный счетчик, чтобы разделить их в соответствии с определенным количеством изображений, загруженных каждым потоком. Начиная с 0, каждые 400 изображений, мы можем использовать один поток для скачивания каждый раз, чтобы мы могли определить количество необходимых потоков, а изображения, загруженные каждым потоком, не будут повторяться.
Метод реализации сжатых файлов: Поскольку сущность генерации сжатых файлов состоит в том, чтобы прочитать поток файлов, который необходимо сжать, а затем сгенерировать сжатый пакет, мы можем использовать контейнер для хранения данных потока изображений, загруженным всеми потоками вместо создания загруженного файла изображения, а затем передавать данные потока в класс сжатия инструмента для сжатия. Это пропускает утомительный процесс чтения файла изображения для создания потока, а затем генерации сжатого пакета, а затем удаления локального файла изображения.
Основные реализации преобразования перечислены ниже:
/ *** Сжатие загруженных изображений в день* @Throws IOException*/ Private Boolean Zippic (String Picpath, String Syndate, Map <String, String> addrmap) Throws IoException {// Поскольку это многопоточная карта изображения, карта потока, новая карта. Concurrenthashmap <string, inputstream> (); // количество изображений, загруженных каждым потоком, определено здесь int count = 400; // Хранение адреса изображения, который необходимо загрузить список <intpirt <string, string >> addrlist = new arraylist <entry <string, string >> (addrmap.entryset ()); // количество потоков, добавьте один, потому что вы хотите создать поток для загрузки последних менее 400 изображений int nthreads = (addrlist.size ()/count) +1; // countdownlatch countdownlatch = new countdownlatch (nthreads); попробуйте {boolean downpic = false; // Выполнить многопоточную загрузку картинки downpic = downpic (picpath, addrlist, piclist, picturelist, nthreads, count); if (downpic) {ziputil.zipbyarray (piclist, new file (picpath+syncate+". Zip")); } вернуть true; } catch (Exception e) {e.printstackTrace (); вернуть ложь; }}Вот создание пула ниток
/ *** Загрузите изображение в соответствии с адресом URL* @Throws TurruptEDException*/ private Boolean DownPic (String picpath, list <string <string, string >> addrlist, map <string, byte []> piclist, map <string, inputstream> picturelist, int nthreads, int cour threadpool = executors.newfixedthreadpool (nthreads); // Создать два счетчика countdownlatch begin = new Countdownlatch (0); Countdownlatch end = new countdownlatch (nthreads); // цикл CREATE THIND FOR (int i = 0; i <nThreads; i ++) {list <entry <string, string >> subaddrlist = null; // Рассчитайте данные, выполненные каждым потоком, если ((i + 1) == nthreads) {int startIndex = (i * count); int endindex = addrlist.size (); subaddrlist = addrlist.sublist (startIndex, endindex); } else {int startIndex = (i * count); int endindex = (i + 1) * count; subaddrlist = addrlist.sublist (startIndex, endindex); } // Класс потоков Picdownload myhead = new Picdownload (Picpath, Subaddrlist, Piclist, PictUrelist); // Способ выполнения потоков здесь состоит в том, чтобы вызвать метод ThreadPool.execute (myhead) в пуле потоков. try {threadpool.execute (myhead); } catch (Exception e) {// Записать журнал ошибок возвращается false; }} begin.countdown (); end.await (); // ЗАКРЫТЬ ТЕПЕРНЫЙ ПЕРЕПОЛЮЧЕСКИЙ ТРЕЗИЙ .shutdown (); // Здесь вы должны зацикливаться, пока все потоки в бассейне потоков не закончится перед тем, как спуститься. Из -за этого шага во время теста детская потока загрузила изображение, но не завершено, и основной поток ушел вниз, что не привело к изображениям в сжатой пакете // вы также можете использовать Countdownlatch для реализации/*while (true) {if (threadpool.istermination ()) {System.out.println («Все детские потоки закончились!»); перерыв; }}*/ return true; }Ниже приведена реализация потока
класс picdownload реализует runnable {// загрузить список адресов списка изображений <entry <string, string >> addrlist; // Загрузите список картин успешно загруженной карты <строка, byte []> piclist; Карта <string, inputstream> picturelist; // локальный путь хранения строки изображения Picpath; Countdownlatch Begin, End; public picdownload (String picpath, list <entry <string, string >> addrlist, map <string, inputstream> piclist, countdownlatch begin, countdownlatch end) {this.addrlist = addrlist; this.piclist = piclist; this.picpath = picpath; this.begin = begin; this.end = end; } @Override public void run () {try {System.out.println (thread.currentThread (). GetName ()+"------"+thread.currentThread (). GetId ()); DownPicture (addrlist); //System.out.println (countdownlatch.getCount ()); begin.await (); } catch (Exception e) {e.printstackTrace (); } наконец {end.countdown (); //countdownlatch.countdown (); }} public boolean downpicture (list <intpirt <string, string >> addrlist) throws exception {inputstream is = null; FileOutputStream fos = null; Url url = null; String filename = null; String picaddr = null; Файл pic = null; try {for (map.entry <string, string> addrentry: addrlist) {filename = addrentry.getkey (); picaddr = addrentry.getValue (); // Создать объект URL url = new URL (picaddr); is = url.openstream (); // Поток, полученный URLConnection, будет записан непосредственно в массив байтов через InputStream и потеряет данные, что приведет к неполным загруженным изображениям. Используйте org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()) для решения // byte [] bytes = ioutils.tobytearray (is); // новый байт [is.aviable ()]; Полученные байты // Данные в потоке считываются в массив байтов. После чтения данные в потоке очищаются piclist.put (имя файла+". Jpg", есть); // В настоящее время, поскольку поток не записывается в файл, поток не должен быть закрыт, в противном случае данные в потоке будут потеряны //is.close (); } вернуть true; } catch (Exception e) {e.printstackTrace (); вернуть ложь; } наконец {// поток не может быть закрыт/*if (null! = is) {is.close (); }*/}}} Я столкнулся с другой проблемой, используя потоки для сжатия выше. При сжатии файла java.net.socketException: сброс соединения
После анализа причины, должно случиться так, что потоковая входная серия и урлконнекция находятся в состоянии соединения, а сброс тайм -аута UrlConnection приводит к тому, что входной поток не может получить.
Я попытался установить время ожидания UrlConnection, но во время теста я обнаружил, что скорость полученного сети полученной загрузки была сильно затронута. Этот метод очень нестабильный и нежелательный. В конце концов, я только отказался от использования потока и использовал байтовый массив, чтобы передать его в класс инструмента сжатия, а затем преобразовал байтовый массив для сжатия потока.
/ ***Используйте контейнер для хранения загруженного массива Byte изображения*/ public boolean downpicture (list <intry <string, string >> addrlist) Throws Exception {inputStream IS = null; FileOutputStream fos = null; Url url = null; String filename = null; String picaddr = null; Файл pic = null; try {for (map.entry <string, string> addrentry: addrlist) {filename = addrentry.getkey (); picaddr = addrentry.getValue (); // Создать объект URL url = new URL (picaddr); // Открыть соединение и создать объект java.net.urlconnection. Этот объект не имеет метода для закрытия соединения. Он может быть преобразован в свой подкласс httpurlConnection, чтобы вызвать метод отключения, чтобы закрыть соединение. //java.net.urlconnection и java.net.httpurlConnection Оба установленных методов тайм -аута для закрытия соединения // httpurlconnection uc = (httpurlconnection) url.openconnection (); is = uc.getinputstream (); // Поток, полученный URLConnection, будет записан непосредственно в массив байтов через InputStream и потеряет данные, что приведет к неполным загруженным изображениям. Использовать org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()) для решения byte [] bytes = ioutils.tobytearray (is); // new byte [is.available ()]; Полученные байты // данные в потоке считываются в массив байтов. После прочтения данные в потоке очищаются //is.read(bytes); piclist.put (имя файла+". jpg", байты); is.close (); } вернуть true; } catch (Exception e) {e.printstackTrace (); вернуть ложь; } наконец {if (null! = is) {is.close (); }}} Суммировать:
Проблемы, столкнутые во время реализации:
1. При использовании пула потоков, для общего состояния, например, контейнер данных байта изображения, хранящийся здесь, совместно используется всеми потоками, поэтому требуется синхронизированный контейнер, в противном случае он вызовет проблемы с сохраненными данными. Следовательно, используется concurrenthashmap <string, byte []>.
2. Существует проблема с порядком выполнения основного потока и детской потоком здесь, потому что основной поток должен ждать всех потоков в пуле потоков, чтобы закончить загрузку изображений, прежде чем сжать изображения. Если основной поток не ждет, пока дочерний поток заканчивается, и выполнит метод сжатия вниз, он приведет к отсутствию или без сжатых изображений. Следовательно, вы можете использовать CountDownLatch для его реализации или использовать мертвый цикл для проверки ThreadPool.isterMination () под операцией пула закрытия потоков, чтобы продолжить выполнение основного потока для сжатия изображения.
3. Поскольку входной поток, полученный с помощью URLConnection, непосредственно передается в сжатый класс для сжатия, существует ситуация, когда временный интернет подключения сбрасывается, поэтому вместо этого загруженный поток хранится в массиве байтов, а затем передается в сжатый класс для сжатия, чтобы избежать неожиданных ситуаций при использовании потока.
4. После использования urlconnection.openstream () для получения входного потока изображение, которое вы преобразовали в массив байтов для загрузки, является неполным. Полем Это может быть решено с помощью org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()). Для получения подробной информации вы можете прочитать исходный код для просмотра реализации.
Ниже приводится реализация класса инструментов FTP:
Импорт java.io.bufferedinputstream; Импорт java.io.bufferedOutputStream; импортировать java.io.fileinputstream; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; Import org.apache.commons.net.ftp.ftpclient; Import org.apache.commons.net.ftp.ftpclientConfig; Import org.apache.commons.net.ftp.ftpconnectionClosedException; Импорт org.apache.commons.net.ftp.ftpreply; открытый класс ftputil2 {private ftpclient ftpclient = null; // адрес сервера FTP Private String HostName; // FTP -сервер по умолчанию порт public static int defaultport = 21; // Имя входа в систему Private String UserName; // Вход паролем частной строки пароль; // Удаленный каталог для доступа к частной строке remotedir; / ** * @param HostName * Адрес хоста * @param port * Номер порта * @param username * username * @param password * password * @param remotidir * По умолчанию работающий каталог * @param is_zhtimezone * Будь то китайский сервер ftp * @return * @return *// ** * new Method */ public ftputil2 () {@return * @return *// ** * new Method */ public ftputil2 () {propConfigIgiG @return *// ** * new Method */ public ftputil2 () {propConfIgIGIGIGIGIGIGIGIGIGIGIGIGIGIG. Propconfig.loadconfig ("System.properties"); String hostname = config.getConfig ("ftpaddress"); String port = config.getConfig ("ftpport"); String username = config.getConfig ("ftpusername"); String password = config.getConfig ("ftpassword"); String remotedir = config.getConfig ("remoteFilePath"); логический is_zhtimezone = true; this.hostname = hostname; this.username = имя пользователя; this.password = пароль; this.remotedir = remotedir == null? "": Remotedir; this.ftpclient = new ftpclient (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControLencoDing ("GBK"); } // Авторизоваться(); // переключить каталог this.changedir (this.remotedir); this.setFileType (ftpclient.binary_file_type); ftpclient.setDefaultport (integer.parseint (port)); } public ftputil2 (String Hostname, int port, String username, String Password, String remotedir, Boolean is_zhtimezone) {this.hostname = hostname; this.username = имя пользователя; this.password = пароль; defaultport = port; this.remotedir = remotedir == null? "": Remotedir; this.ftpclient = new ftpclient (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControLencoDing ("GBK"); } // Войдите в in this.login (); // переключить каталог this.changedir (this.remotedir); this.setfiletype (ftpclient.ascii_file_type); ftpclient.setDefaultport (порт); } / *** Войдите на FTP -сервер* / public boolean login () {boolean success = false; try {ftpclient.connect (this.hostname, defaultport); ftpclient.login (this.username, this.password); int ответить; reply = ftpclient.getReplyCode (); if (! ftpreply.ispositivecoplusion (reply)) {ftpclient.disconnect (); вернуть успех; }} catch (ftpConnectionClosexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } успех = true; System.out.println («Подключите к FTP -серверу:« + this.hostname + «Успех .. навести в систему»); вернуть успех; } private static ftpClientConfig config () {ftpClientConfig conf = new ftpClientConfig (ftpClientConfig.syst_Unix); conf.setRecentDateFormatstr ("MM Month DD Date HH: MM"); // conf.setRecentDateFormatstr ("(Yyyyy Year)? MM Month DD DATE (HH: MM)?"); вернуть конф; } / ** * Изменение рабочего каталога * * @param remotedir * * / public void mediceir (string remotedir) {try {this.remotedir = remotedir; ftpclient.changeWorkingDirectory (remotedir); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } System.out.println («Изменить рабочий каталог на:" + remotedir); } / ** * Возвращение в предыдущий каталог уровня (родительский каталог) * / public void toparentDir () {try {ftpclient.changetoparentDirectory (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }} / ***Перечислите все файлы в текущем рабочем каталоге* / public String [] listallFiles () {string [] names = this.listFiles ("*"); вернуть this.sort (имена); } / ** * Список соответствующих файлов в указанном рабочем каталоге * * @param dir * exp: / cim / * @param file_regex * wiledcard is * * / public string [] listallfiles (string dir, string file_regex) {string [] names = this.listfiles (dir + file_regex); вернуть this.sort (имена); } /** * Список соответствующих файлов * * @param file_regex * символы совпадения, символы подстановочных знаков - * * /public String [] listfiles (string file_regex) {try { /** * ftpfile [] remotefiles = ftpclient.listfiles (file_regex); * //System.out.println(remotefiles.length); String [] name = new * string [remotefiles.length]; if (remotefiles! = null) {for (int * i = 0; i <remotefiles.length; i ++) {if (remotefiles [i] == null) * name [i] = ""; else * if (remotefiles [i] .getName () == null || remotefiles * [i] .getName (). equals * (".") || remotefiles [i] .getName (). equals ("..")) {name [i] = ""; *} else name [i] = remotefiles [i] .getName (); * System.out.println (name [i]); }} */ ftpclient.enterlocalpassivivemode (); String [] name = ftpclient.listnames (file_regex) ;; if (name == null) вернуть новую строку [0]; вернуть this.sort (имя); } catch (Exception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } вернуть новую строку [0]; } public void списки (string reg) {try {string [] a = ftpclient.listnames (reg); if (a! = null) {for (string b: a) {System.out.println (b); }}} catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }} / ** * Установите тип переданного файла [текстовый файл или двоичный файл] * * @param filetype * -binary_file_type, ascii_file_type * / public void setFileType (int filetype) {try {ftpclient.setFileType (filetype); } catch (ioException e) {e.printstackTrace (); }}/ *** upload file** @param localfilepath* -local file path + имя файла* @param newfilename* -new file name*/ public void uploadfile (String localfilepath, String newfilename) {// upload file wiod.ftpclient.enterocalPassivivivivemode (); // passive mode connection suplectire = netrpempeam = netrpempeam = netpcure -intrempeam = netrpempeam = netrpempeam = netrpempeam = netrullimpeam = netrullimpeam; try {buffin = new BufferedInputStream (new FileInputStream (LocalFilePath)); Boolean ifupload = ftpclient.storefile (newfilename, buffin); if (! ifupload) {System.out.println ("Загрузите файл не удастся ..."); } else {System.out.println ("успешно загрузить файл ..."); }} catch (Exception e) {e.printstackTrace (); } наконец {try {if (buffin! = null) buffin.close (); } catch (Exception e) {e.printstackTrace (); }}}/ ** * file upload 2 * * @param file * -fileinputStream file * @param newfilename * -new file name */ public void newuploadfile (fileInputStream, string newFilename) {// upload connective suplectire = neplulleam; try {buffin = new bufferedinputstream (file); Boolean ifupload = ftpclient.storefile (newfilename, buffin); if (! ifupload) {System.out.println ("Файл загрузки не удастся ..."); } else {System.out.println ("Успешно загружать файл ..."); }} catch (Exception e) {e.printstackTrace (); } наконец {try {if (buffin! = null) buffin.close (); } catch (Exception e) {e.printstackTrace (); } } } /** * Download file (single) * * @param remoteFileName * --File name on the server* @param localFileName * --local file name*/ public boolean downloadFile(String remoteFileName, String localFileName) { this.ftpClient.enterLocalPassiveMode();// Passive mode connection BufferedOutputStream buffOut = null; try {buffout = new BufferedOutputStream (New FileOutputStream (LocalFilEName)); boolean ifdownload = ftpclient .retrievefile (remotefilename, buffout); if (! ifdownload) {System.out.println ("Fail Fail Fail Fail ..."); вернуть ложь; } else {System.out.println ("Скачать файл успешно ..."); }} catch (Exception e) {e.printstackTrace (); вернуть ложь; } наконец {try {if (buffout! = null) buffout.close (); } catch (Exception e) {e.printstackTrace (); }} вернуть true; } / *** Закройте соединение FTP* / public void close () {try {if (ftpclient! = Null) {ftpclient.logout (); ftpclient.disconnect (); }} catch (Exception e) {e.printstackTrace (); }} / ** * Bubble Sort String (от большой до маленькой) * / public String [] sort (string [] str_array) {if (str_array == null) {бросить новое nullpointerexception ("str_array не может быть нулевым!"); } String tmp = ""; for (int i = 0; i <str_array.length; i ++) {for (int j = 0; j <str_array.length - i - 1; j ++) {if (str_array [j] .compareto (str_array [j+1]) <0) {tmp = str_array [j]; str_array [j] = str_array [j + 1]; str_array [j + 1] = tmp; }}} вернуть str_array; } public static void main (string [] strs) {ftputil2 ftputil2 = new ftputil2 ("192.168.1.112", 20011, "test1", "test1", "/", true); Ftputil2.downloadfile ("test.txt", "d: //test.txt"); }}Ниже приведен класс Zip Tool:
Импорт java.io.file; импортировать java.io.fileinputstream; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; импортировать java.io.inputstream; импортировать java.io.outputstream; импортировать java.util.arraylist; Импорт java.util.enumeration; импортировать java.util.list; импортировать java.util.map; Импорт java.util.zip.zipentry; Импорт java.util.zip.zipfile; импортировать java.util.zip.zipoutputstream; Импорт org.apache.commons.io.ioutils; Импорт com.ibatis.common.logging.log; Импорт com.ibatis.common.logging.logfactory; открытый класс Ziputil {private Static Final Log log = logfactory.getLog (ziputil.class); / *** Сжатый файл** @param srcfile file [] Список файлов, которые необходимо сжать* @param zipfile, сжатые файлы*/ public static outputStream Zipfiles (List <File> srcfile, outputStream outputStream) {byte [] buf = new Byte [1024]; try {// Создать zip -файл ZipOutputStream OUT = new ZipOutputStream (outputStream); // Сжатие файлов для (int i = 0; i <srcfile.size (); i ++) {file file = srcfile.get (i); FileInputStream in = new FileInputStream (file); // Добавить ZIP вход в выходной поток. out.putnextentry (new Zipentry (file.getName ())); // Передача байтов из файла в Zip -файл int len; while ((len = in.read (buf))> 0) { //System.out.println(len+"=========================================================================== ================================================================================================ ================================================================================================ ================================================================================================ e) {log.error ("Ziputil Zipfiles Exception:"+e); Byte [1024]; Поток вывода. } catch (ioException e) {log.error ("Ziputil Zipfiles Exception:"+e); Zipfile) {try {// Создать zip -файл ZipoutputStream Out = new ZipoutputStream (New FileOutputStream (ZipFile)); FileEntry.getValue (); out.closeentry (); Файл * @param srcfile * @param zipfile * @see */ public static void zipbyarray (map <string, byte []> srcfile, файл zipfile) {byte [] buf = new Byte [1024]; Files System.out.println (srcfile.EntrySet (). Size ()); Байты из файла Zip -File Byte [] bytes = fileEntry.getValue (); // ioutils.tobytearray (in); Исключение: "+e); system.out.println (e.getmessage ());}} / *** unzip** @param file файла файла Zipfile Zipfile, который должен быть раскрыт* @param descdir string string decompresected garletory* / / public void unzipfil Zipfile (Zipfile); System.out.println (ZipentryName); out.close (); File ("D: //1.jpg"); Ziputil.zipfiles (srcfile, zipfile); Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.