Как создать ZIP InputStream в Android без создания ZIP-файла?

Я использую NanoHTTPD в качестве веб-сервера в своем Android APP, я надеюсь сжать некоторые файлы и создать InputStream на стороне сервера, и я загружаю InputStream на стороне клиента, используя Code A.

Я прочитал код B в разделе Как распаковать и распаковать файлы? , Но как создать ZIP InputStream в Android без создания ZIP-файла?

Кстати, я не думаю, что Code C – хороший способ, потому что он сначала делает ZIP-файл, а затем конвертирует ZIP-файл в FileInputStream, я надеюсь создать ZIP InputStream напрямую!

Код А

private Response ActionDownloadSingleFile(InputStream fis) { Response response = null; response = newChunkedResponse(Response.Status.OK, "application/octet-stream",fis); response.addHeader("Content-Disposition", "attachment; filename="+"my.zip"); return response; } 

Код B

 public static void zip(String[] files, String zipFile) throws IOException { BufferedInputStream origin = null; ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); try { byte data[] = new byte[BUFFER_SIZE]; for (int i = 0; i < files.length; i++) { FileInputStream fi = new FileInputStream(files[i]); origin = new BufferedInputStream(fi, BUFFER_SIZE); try { ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1)); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { out.write(data, 0, count); } } finally { origin.close(); } } } finally { out.close(); } } 

Код C

 File file= new File("my.zip"); FileInputStream fis = null; try { fis = new FileInputStream(file); } catch (FileNotFoundException ex) { } 

Solutions Collecting From Web of "Как создать ZIP InputStream в Android без создания ZIP-файла?"

ZipInputStream согласно документации ZipInputStream

ZipInputStream – это фильтр входного потока для чтения файлов в формате ZIP-файла. Включает поддержку как сжатых, так и несжатых записей.

Раньше я отвечал на этот вопрос таким образом, что это невозможно с помощью ZipInputStream . Я прошу прощения.

Но после того, как я потратил некоторое время, я обнаружил, что это возможно в соответствии с приведенным ниже кодом

Очень очевидно, что, поскольку вы отправляете файлы в формате zip по сети.

 //Create proper background thread pool. Not best but just for solution new Thread(new Runnable() { @Override public void run() { // Moves the current Thread into the background android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); HttpURLConnection httpURLConnection = null; byte[] buffer = new byte[2048]; try { //Your http connection httpURLConnection = (HttpURLConnection) new URL("https://s3-ap-southeast-1.amazonaws.com/uploads-ap.hipchat.com/107225/1251522/SFSCjI8ZRB7FjV9/zvsd.zip").openConnection(); //Change below path to Environment.getExternalStorageDirectory() or something of your // own by creating storage utils File outputFilePath = new File ("/mnt/sdcard/Android/data/somedirectory/"); ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(httpURLConnection.getInputStream())); ZipEntry zipEntry = zipInputStream.getNextEntry(); int readLength; while(zipEntry != null){ File newFile = new File(outputFilePath, zipEntry.getName()); if (!zipEntry.isDirectory()) { FileOutputStream fos = new FileOutputStream(newFile); while ((readLength = zipInputStream.read(buffer)) > 0) { fos.write(buffer, 0, readLength); } fos.close(); } else { newFile.mkdirs(); } Log.i("zip file path = ", newFile.getPath()); zipInputStream.closeEntry(); zipEntry = zipInputStream.getNextEntry(); } // Close Stream and disconnect HTTP connection. Move to finally zipInputStream.closeEntry(); zipInputStream.close(); } catch (IOException e) { e.printStackTrace(); }finally { // Close Stream and disconnect HTTP connection. if (httpURLConnection != null) { httpURLConnection.disconnect(); } } } }).start();