diff --git a/src/main/java/com/reandroid/archive/InputSourceUtil.java b/src/main/java/com/reandroid/archive/InputSourceUtil.java index 1fc8a88..49d283e 100644 --- a/src/main/java/com/reandroid/archive/InputSourceUtil.java +++ b/src/main/java/com/reandroid/archive/InputSourceUtil.java @@ -15,12 +15,13 @@ */ package com.reandroid.archive; -import java.io.File; +import java.io.*; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; -public class InputSourceUtil { + public class InputSourceUtil { public static String toRelative(File rootDir, File file){ int len=rootDir.getAbsolutePath().length(); @@ -37,14 +38,11 @@ public class InputSourceUtil { while (path.startsWith("/")){ path=path.substring(1); } - while (path.startsWith(File.separator)){ - path=path.substring(1); - } return path; } public static Map mapZipFileSources(ZipFile zipFile){ - Map results=new HashMap<>(); + Map results=new LinkedHashMap<>(); Enumeration entriesEnum = zipFile.entries(); int i=0; while (entriesEnum.hasMoreElements()){ @@ -54,11 +52,42 @@ public class InputSourceUtil { } ZipEntrySource source=new ZipEntrySource(zipFile, zipEntry); source.setSort(i); + source.setMethod(zipEntry.getMethod()); results.put(source.getName(), source); i++; } return results; } + public static Map mapInputStreamAsBuffer(InputStream inputStream) throws IOException { + Map results = new LinkedHashMap<>(); + ZipInputStream zin = new ZipInputStream(inputStream); + ZipEntry zipEntry; + int i=0; + while ((zipEntry=zin.getNextEntry())!=null){ + if(zipEntry.isDirectory()){ + continue; + } + byte[] buffer = loadBuffer(zin); + String name = sanitize(zipEntry.getName()); + ByteInputSource source = new ByteInputSource(buffer, name); + source.setSort(i); + source.setMethod(zipEntry.getMethod()); + results.put(name, source); + i++; + } + zin.close(); + return results; + } + private static byte[] loadBuffer(InputStream in) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buff=new byte[40960]; + int len; + while((len=in.read(buff))>0){ + outputStream.write(buff, 0, len); + } + outputStream.close(); + return outputStream.toByteArray(); + } public static List listZipFileSources(ZipFile zipFile){ List results=new ArrayList<>(); Enumeration entriesEnum = zipFile.entries(); diff --git a/src/main/java/com/reandroid/archive/ZipArchive.java b/src/main/java/com/reandroid/archive/ZipArchive.java index d559c5d..8f8b544 100644 --- a/src/main/java/com/reandroid/archive/ZipArchive.java +++ b/src/main/java/com/reandroid/archive/ZipArchive.java @@ -30,7 +30,7 @@ public class ZipArchive { this.mEntriesMap=entriesMap; } public ZipArchive(){ - this(new HashMap<>()); + this(new LinkedHashMap<>()); } public void extract(File outDir) throws IOException { @@ -95,19 +95,22 @@ public class ZipArchive { List sourceList = InputSourceUtil.listZipFileSources(zipFile); this.addAll(sourceList); } - public void addAll(Collection inputSourceList){ + public void addAll(Collection inputSourceList){ for(InputSource inputSource:inputSourceList){ add(inputSource); } } public void add(InputSource inputSource){ + if(inputSource==null){ + return; + } String name=inputSource.getName(); Map map=mEntriesMap; map.remove(name); map.put(name, inputSource); } public List listInputSources(){ - return InputSourceUtil.sort(new ArrayList<>(mEntriesMap.values())); + return new ArrayList<>(mEntriesMap.values()); } public InputSource getInputSource(String name){ return mEntriesMap.get(name);