1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | public class ExtractZipDir { public static void main(String[] args ) { if (args.length < 2 ) { System.out.println( "Informe o arquivo zip e a pasta" ); return ; } String zipName = args[ 0 ]; String dirName = args[ 1 ]; extract(zipName, dirName); } static void extract(String zipName, String dirName) { long before = currentTimeMillis(); try (ZipFile zip = new ZipFile( new File(zipName))) { ZipContent zContent = new ZipContent(zip); int files = zContent.extract(dirName); System.out.printf( "Extraiu %s arquivos (e, %sms)" , files, currentTimeMillis() - before); } catch (Exception ex) { ex.printStackTrace(); } } private static class ZipContent { private final ZipFile zip; private Map<String, List<ZipEntry>> content = new HashMap<>(); private int count; private static final String SEPARATOR = "/" ; private static final String ROOT_DIRECTORY = "." ; private static final int BUFFER = 2048 ; private ZipContent (ZipFile zipFile) { zip = zipFile; organizeEntries(zip.entries()); } private void organizeEntries(Enumeration<? extends ZipEntry> entries) { putRootDir(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); putEntry(entry); } } private void putEntry(ZipEntry entry) { String path = extractDirNameFromEntry(entry); List<ZipEntry> entries = content.get(path); if (entries == null ) { content.put(path, new LinkedList<ZipEntry>()); } else { entries.add(entry); } } private void putRootDir() { content.put(ROOT_DIRECTORY, new LinkedList<ZipEntry>()); } private List<ZipEntry> listContent(String folder) { return content.get(folder); } private boolean hasDirectory(String folder) { return content.keySet().contains(folder); } private Queue<String> getAllDirectoriesFromParent(String dir) { Queue<String> q = new LinkedList<>(); for (String d: content.keySet()) { if (d.contains(dir) && !d.equals(dir)) q.add(d); } q.add(dir); return q; } private int extract(String dir) { if (!dir.equals(ROOT_DIRECTORY)) { if (!dir.endsWith(SEPARATOR)) { dir = dir.concat(SEPARATOR); } if (!hasDirectory(dir)) { throw new RuntimeException( "Directory not found!" ); } } count = 0 ; Queue<String> dirs = getAllDirectoriesFromParent(dir); while (!dirs.isEmpty()) { String path = dirs.poll(); List<ZipEntry> entries = listContent(path); File parent = new File(path); parent.mkdirs(); for (ZipEntry entry: entries) { extract(parent, entry); count++; } } return count; } private void extract(File path, ZipEntry e) { String fileName = extractFilenameFromEntry(e); File destFile = new File(path, fileName); try (BufferedInputStream is = new BufferedInputStream(zip.getInputStream(e)); FileOutputStream fos = new FileOutputStream(destFile); BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) { int currentByte; byte data[] = new byte [BUFFER]; while ((currentByte = is.read(data, 0 , BUFFER)) != - 1 ) { dest.write(data, 0 , currentByte); } dest.flush(); } catch (IOException e) { throw new RuntimeException( "Não foi possível extrair!\n" + e.getMessage(), e); } } private static String extractDirNameFromEntry(ZipEntry entry) { String name = entry.getName(); if (name.lastIndexOf(SEPARATOR) != - 1 ) { return name.substring( 0 , name.lastIndexOf(SEPARATOR)+ 1 ); } return ROOT_DIRECTORY; } private static String extractFilenameFromEntry(ZipEntry entry) { String name = entry.getName(); if (name.lastIndexOf(SEPARATOR) == - 1 ) { return name; } return name.substring(name.lastIndexOf(SEPARATOR)+ 1 ); } } } |
Alguns formas de como executar esse programa (Linux / Windows):
1 2 | $ java ExtractZipDir /home/user/meu .zip dir $ java C:\usuario\Documents\meu.zip dir |
Compartilhei esse código no github.
@edermag
No comments:
Post a Comment