import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ApkUtil { private static final Logger logger = LoggerFactory.getLogger(ApkUtil.class); private static final byte[] sourceApkBytes = initializeSourceApk(); private ApkUtil(){} private static byte[] initializeSourceApk() { String sourceApkPath = ApkUtil.class.getResource("/app/ZHXS.apk").getPath(); byte[] tmpBytes = new byte[1024]; File apkFile = new File(sourceApkPath); ByteArrayOutputStream apkOut = new ByteArrayOutputStream(); FileInputStream apkFis = null; try { apkFis = new FileInputStream(apkFile); int b = 0; while ((b = apkFis.read(tmpBytes)) != -1) { apkOut.write(tmpBytes, 0, b); } return apkOut.toByteArray(); } catch (Exception e) { logger.error(e.getMessage() ,e); } finally { closeInputStream(apkFis); closeOutputStream(apkOut); } return null; } private static void closeOutputStream(OutputStream outputStream) { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { logger.error(e.getMessage(), e); } } } private static void closeInputStream(InputStream inputStream) { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { logger.error(e.getMessage(), e); } } } public static byte[] addFilesToExistingZip(String fileName) throws IOException { ByteArrayOutputStream finalByteArrayOutputStream = new ByteArrayOutputStream(); ZipOutputStream zipOutputStrem = new ZipOutputStream(finalByteArrayOutputStream); ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(sourceApkBytes)); ZipEntry entry = zipInputStream.getNextEntry(); byte[] buf = new byte[1024]; while (entry != null) { String name = entry.getName(); zipOutputStrem.putNextEntry(new ZipEntry(name)); int len; while ((len = zipInputStream.read(buf)) > 0) { zipOutputStrem.write(buf, 0, len); } entry = zipInputStream.getNextEntry(); } closeInputStream(zipInputStream); if (StringUtils.isNotBlank(fileName)) { zipOutputStrem.putNextEntry(new ZipEntry("META-INF/" + fileName)); } zipOutputStrem.closeEntry(); closeOutputStream(zipOutputStrem); return finalByteArrayOutputStream.toByteArray(); } public static void downloadApk(String fileName, HttpServletResponse response) { ServletOutputStream output = null; try { output = response.getOutputStream(); byte[] bytes = null; if (StringUtils.isNotBlank(fileName)) { bytes = addFilesToExistingZip(fileName); } else { bytes = sourceApkBytes; } output.write(bytes); } catch (IOException e) { logger.error("Failed to download" + fileName + "apk"); } finally { closeOutputStream(output); } } public static void main(String[] args) { try { byte[] bytes = addFilesToExistingZip("zhxs_2699_"+URLEncoder.encode("测试", "utf-8")); String targetDir = ApkUtil.class.getResource("/app/").getPath(); // 输出 FileOutputStream outt = new FileOutputStream(new File(targetDir + "zhxs_2699.apk")); outt.write(bytes); outt.close(); } catch (IOException e) { e.printStackTrace(); } } }
压缩包在内存中添加文件,并直接输出
猜你喜欢
转载自flyvszhb.iteye.com/blog/2216851
今日推荐
周排行