如何在不先保存的情况下在 Android 中发送 zip 文件?

Posted

技术标签:

【中文标题】如何在不先保存的情况下在 Android 中发送 zip 文件?【英文标题】:How to send a zip file in Android without saving it first? 【发布时间】:2020-03-22 22:04:52 【问题描述】:

我有这个代码可以压缩成 zip 格式的一些文件:

 public int zip(List<String> _files, String zipFileName) 
        try 
            BufferedInputStream origin = null;
            FileOutputStream dest = new FileOutputStream(zipFileName);
            ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
                    dest));
            byte data[] = new byte[BUFFER];

            for (int i = 0; i < _files.size(); i++) 
                Log.v("Compress", "Adding: " + _files.get(i));
                FileInputStream fi = new FileInputStream(_files.get(i));
                origin = new BufferedInputStream(fi, BUFFER);

                ZipEntry entry = new ZipEntry(_files.get(i).substring(_files.get(i).lastIndexOf(File.separator) + 1));
                out.putNextEntry(entry);
                int count;

                while ((count = origin.read(data, 0, BUFFER)) != -1) 
                    out.write(data, 0, count);
                
                origin.close();
            

            out.close();
         catch (Exception e) 
            e.printStackTrace();
        
        return 1;
    

我想获取 ZipOutPutStream 并通过 Intent 或其他方式发送它,而不是像这样保存:

while ((count = origin.read(data, 0, BUFFER)) != -1) 
                    out.write(data, 0, count);
                

有办法吗?目前我只能使用其保存的名称作为字符串发送 zip。

【问题讨论】:

【参考方案1】:

没有办法。 Intent 被限制为 2 MB,因此它只能容纳一个非常小的 zip 文件。接收者并不期待原始数据。您也不能发送对象(如 ZipOutputStream),因为 Intents 仅发送其附加内容的序列化版本,因为接收者可能不在同一个进程中。

【讨论】:

诀窍是您需要在接收者完成后将其删除。因此,可能值得将其写入缓存文件并让 android 为您执行此操作,或者在将来的某个时间执行此操作。 嗯...我并没有考虑将它写入缓存中。我该怎么做? 对于 zip 文件名,使其相对于缓存目录 getCacheDir()。

以上是关于如何在不先保存的情况下在 Android 中发送 zip 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不先“下载”的情况下通过 Android 网络浏览器显示 PDF

如何在不大幅增加其大小的情况下在 PowerShell 中保存文本文件?

如何在不登录的情况下在 Android 中发布到 Facebook Wall?

如何在不使用 System.Net 类的情况下在 C# 中发送 HTTP 请求? [复制]

如何在不为每条记录调用发送方法的情况下在 Kafka Avro 生产者中发送对象的 ArrayList? [复制]

如何在不缩小图像的情况下在 Android 中调整图像大小?