如何在不创建ZIP文件的情况下在Android中创建ZIP InputStream?
问题描述:
我在Android应用程序使用NanoHTTPD作为Web服务器,希望压缩某些文件并创建在服务器端的InputStream,我使用代码A.如何在不创建ZIP文件的情况下在Android中创建ZIP InputStream?
我在How to zip and unzip the files?阅读代码B下载客户端InputStream的,但如何在不创建ZIP文件的情况下在Android中创建ZIP InputStream?我不认为Code C是好的方法,因为它首先制作ZIP文件,然后将ZIP文件转换为FileInputStream,我希望直接创建一个ZIP InputStream!
代码A
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)
{
}
答
紫pInputStream按照文档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();
+0
@HelloCW让我知道你是否尝试过,因为它工作正常,根据所需的输出。然而,它在结束流方面需要稍微优化。 –
您需要在服务器中创建一个*输出*流。一个'ZipOutputStream',围绕着服务器技术给你的任何输出流。 – EJP
谢谢!对于EJP,你能给我一些示例代码吗? – HelloCW
由于ZipInputSteam扩展了FilterInputStream,所以不能直接制作ZipInputSteam,所以它基本上起到了包装类的作用,它为流读取zip文件提供了功能。你需要像'new ZipInputStream(new FileInputStream(zipFile))' –