こんにちは私はAndroidファイルエクスプローラーアプリケーションに取り組んでいます。大きなフォルダーのダウンロードが要求された場合、フォルダーを圧縮して、以下のコードを使用して出力ストリームに書き込みますが、ファイルがダウンロードされるまで、それ以降の要求はブロックされます。問題は何ですか?これをスレッドに移動することを検討する必要がありますか? ?私はすでに多くのバリエーションを試しましたが、どれもうまくいかないようです。正しい方向へのポインタがあれば大歓迎です。
if(f.isDirectory()&& action.equalsIgnoreCase("download")){
File zip=new File(file);
entity = new EntityTemplate(new ContentProducer() {
public void writeTo(final OutputStream outstream) throws IOException {
action=null;
OutputStreamWriter writer=fileop.createZipFile(file, outstream);
writer.flush();
}
});response.setHeader("Content-Type", "application/zip");
response.setHeader("Content-Disposition","attachment; filename=\"" +zip.getName()+".zip\"");
response.setEntity(entity);
}
createZipFileMethod:
OutputStreamWriter createZipFile(String sourceDir,OutputStream os) {
// TODO Auto-generated method stub
OutputStreamWriter osw=null;
try
{
//wrap object of OutputStream
osw=new OutputStreamWriter(os,"UTF-8");
//create object of ZipOutputStream from OutputStream
ZipOutputStream zout = new ZipOutputStream(os);
//create File object from source directory
File fileSource = new File(sourceDir);
addDirectory(zout, fileSource);
//close the ZipOutputStream
zout.close();
System.out.println("Zip file has been created!");
}
catch(IOException ioe)
{
System.out.println("IOException :" + ioe);
}
return osw;
}
private static void addDirectory(ZipOutputStream zout, File fileSource) {
//get sub-folder/files list
File[] files = fileSource.listFiles();
System.out.println("Adding directory " + fileSource.getName());
for(int i=0; i < files.length; i++)
{
//if the file is directory, call the function recursively
if(files[i].isDirectory())
{
addDirectory(zout, files[i]);
continue;
}
/*
* we are here means, its file and not directory, so
* add it to the zip file
*/
try
{
System.out.println("Adding file " + files[i].getName());
//create byte buffer
byte[] buffer = new byte[1024];
//create object of FileInputStream
FileInputStream fin = new FileInputStream(files[i]);
zout.putNextEntry(new ZipEntry(files[i].getName()));
/*
* After creating entry in the zip file, actually
* write the file.
*/
int length;
while((length = fin.read(buffer)) > 0)
{
zout.write(buffer, 0, length);
}
/*
* After writing the file to ZipOutputStream, use
*
* void closeEntry() method of ZipOutputStream class to
* close the current entry and position the stream to
* write the next entry.
*/
zout.closeEntry();
//close the InputStream
fin.close();
}
catch(IOException ioe)
{
System.out.println("IOException :" + ioe);
}
}
}