2017-02-20 13 views
11

私はHow to zip and unzip the files?でコードBを読んでいる私はいくつかのファイルを圧縮し、サーバ側でのInputStreamを作成したいと考えています、と私はコードA.最初にZIPファイルを作成せずにAndroidでZIP InputStreamを作成するにはどうすればよいですか?

を使用して、クライアント側でのInputStreamをダウンロードし、私のAndroidアプリでのWebサーバーとしてNanoHTTPDを使用最初にZIPファイルを作成せずにAndroidでZIP InputStreamを作成するにはどうすればよいですか?

私はZIPファイルを最初に作成し、ZIPファイルをFileInputStreamに変換するので、コードCは良い方法だとは思わない、私は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

+0

*出力*ストリームをサーバーに作成する必要があります。 'ZipOutputStream'は、サーバ技術があなたに与えている出力ストリームを包んでいます。 – EJP

+0

ありがとう! EJPに、サンプルコードを教えていただけますか? – HelloCW

+0

ZipInputSteamはFilterInputStreamを拡張しているため、ZipInputSteamを直接作成することはできません。したがって、基本的にストリームがzipファイルを読み取る機能を提供するラッパークラスとして機能します。 '新しいZipInputStream(新しいFileInputStream(zipFile)) 'のようなものが必要でしょう –

答えて

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

} 

紫ZipInputStream ZipInputStream

ドキュメントごとなどpInputStreamは、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は希望の出力ごとに正常に動作しているため、試してみました。しかし、ストリームを閉じるという点では少し最適化が必要です。 –