InputStream 不会关闭,或者需要很长时间才能关闭

2023-12-19

我正在尝试将外部 mp3 下载到内部存储中。但是,我尝试下载的文件很大,因此我尝试以 1MB 的块下载它们,以便您可以在下载其余文件的同时开始播放它们。这是我的流代码:

    InputStream is = null;
    OutputStream os = null;

    try {
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet( url );
        HttpResponse response = client.execute( get );

        MyLog.d( "Connection established" );

        byte[] buffer = new byte[8192];
        is = new BufferedInputStream( response.getEntity().getContent(), buffer.length );
        os = openFileOutput( filename, MODE_PRIVATE );

        int size;
        int totalSize = 0;

        while (( size = is.read( buffer ) ) != -1 && totalSize < 1048576) {
            os.write( buffer, 0, size );
            totalSize += size;
        }

        MyLog.d( "Finished downloading mix - " + totalSize + " bytes" );
    }
    catch (ClientProtocolException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        if ( os != null ) {
            try {
                os.flush();
                os.close();
            }
            catch (IOException e) {
                MyLog.e( "Failed to close output stream." );
            }
        }
        if ( is != null ) {
            try {
                is.close();
            }
            catch (IOException e) {
                MyLog.e( "Failed to close input stream." );
            }
        }
    }

它可以很好地下载文件,但是当它到达finally语句中的is.close()时,它挂起。如果我等一个really时间长了终究会关门。看起来它仍在下载文件的其余部分。如何避免这种情况并立即关闭流?


对于 HTTP,您通常仍然必须读取(并丢弃)响应流的整个其余部分 - 您不能只是关闭。必须消耗整个流。我不确定 Android 的 httpclient 是基于 commons httpclient 3 还是 4 - 使用 4,您可以使用 HttpUriRequest#abort() 提前结束。不知道3有没有这样的选项

编辑:查了一下,它看起来像 httpclient 3 ,你可以做 httpget.abort()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InputStream 不会关闭,或者需要很长时间才能关闭 的相关文章

随机推荐

  • 未知的正则化器:tensorflowjs 中的 L2

    我已经使用 model 在 python 中训练了一个模型 reg 0 000001 model Sequential model add Dense 24 activation tanh name input dense input sh
  • SQL:给定行之前和之后的行数

    问题是我们要获取给定行 例如由主键标识 之前和之后的总行数 我尝试过在 T SQL MSSQL 2008 中执行以下操作 它给出了正确的结果 但我不知道这是否是最好的方法 WITH cte before AS SELECT ROW NUMB
  • 是否可以在 Spring 中以基于表单的身份验证发送更多数据?

    我对这个比较陌生Spring框架 http en wikipedia org wiki Spring Framework和春季安全 我使用了自定义身份验证方案 HTML
  • 将大型 3gp 文件转换为字节数组

    我正在尝试将大型 3gp 文件 gt 25mb 转换为字节数组 但它给出了内存不足异常 我能够将小于 25 mb 的 3gp 文件转换为字节数组 文件文件1 新文件 Environment getExternalStorageDirecto
  • 如何最大限度地提高 C# 中大数组上按元素运算的性能

    该操作是将数组的每个第 i 个元素 称为 A 与相同大小的矩阵 B 的第 i 个元素相乘 并用获得的值更新 A 的相同第 i 个元素 在算术公式中 A i A i B i 0 在多核环境中优化此操作的最佳方法是什么 这是我当前的代码 var
  • 提取 ARIMA 规范

    从 auto arima 打印拟合模型对象包括一行 例如 带有漂移的 ARIMA 2 1 0 这将是一个很好的项目 可以包含在说明拟合模型的 sweave 或其他 输出中 是否可以将该行提取为块 此时 我所做的最好的事情是从 arma 组件
  • 如何从asp.net中的url中删除页面名称?

    来自以下网址 http www mywebsite com default aspx 我想删除default aspx 这样网址将如下所示 http www mywebsite com 我需要一种快速而干净的方法来执行此操作 并且我只需要使
  • 在单独的构建过程中签入文件后,我可以绕过门控签入构建吗? 2010年TFS

    我为解决方案设置了 2 个构建定义 1 个是每晚触发的夜间构建 另一个是门控签入构建 当开发人员尝试将新更改签入源代码管理时将触发 每晚构建使用自定义模板 该模板使用稍微修改过的方法来增加程序集版本埃瓦尔德 霍夫曼法 http www ew
  • 一夜不活动后出现一般网络错误

    一段时间以来 我们的旗舰应用程序一直出现神秘错误 错误消息是通用的 DBNETLIB ConnectionWrite send 一般网络错误 检查您的网络文档 通过让应用程序在晚上打开并在早上恢复工作 可以可靠地重现这一点 由于它是后端服务
  • Rails 2.3 和 rspec-rails 兼容性

    什么版本的rspec railsgem 仍然与 Rails 2 3 分支兼容 特别是 2 3 14 我试过了2 1 0 但这也适用于 Rails gt 3 0 我应该注意的任何其他依赖项或版本限制吗 Thanks 版本 1 3 4 是 Ra
  • mysql + 导入列标题中有空格的文件 + 如何处理

    我有一个 csv 文件 我想将其导入到 mysql 中 我正在慢慢地做到这一点 我正在尝试使用加载数据文件 https stackoverflow com a 20895203 2392358但首先我必须创建表格 这就是我的问题所在 我尝试
  • Android:与 Android 设备进行 RS232 串行通信

    我有一个MR400s 出租车计价器 http www taxiworld co uk london taximeter rentals硬件 我想使用RS232电缆与这个出租车计价器进行通信 并且我已经在Windows中实现了这种连接和通信
  • 程序结束后出现分段错误

    我正在做一项家庭作业 而且我对 C 还比较陌生 我必须为整数数组创建一个初始值设定项 我的教授给我的声明是 typedef int set t Can t be altered void init set t thing int N Can
  • DNS-SD:使用“mdnsjava”的经验? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我现在正在实施 DNS DS 库 mdnsjava https code google com p mdnsjava 进入我的Andr
  • jquery创建二维数组

    编辑 看来我对我想要完成的事情有点困惑 对于那些花时间解释这一点的人 谢谢 我正在尝试在 Jquery Javascript 中创建一个二维数组 我已经进行了大量的搜索 测试和更多搜索 但我无法找到对我来说真正有意义的解决方案 这已经是漫长
  • python请求中的Http重定向代码3XX

    我正在尝试捕获重定向 url 的 http 状态代码 3XX 302 但我无法获取它 因为它给出了 200 状态代码 这是代码 import requests r requests get http goo gl NZek5 print r
  • IdentityServer4 如何在登录后重定向到上一个 url 页面而不在 IdP 注册所有路由

    按照建议 我会在 IdP 上注册授权回调 url redirect url 它可以工作 但是 如果使用 MVC 应用程序的客户端尝试访问未经授权的页面 将会被重定向到 idsrv 登录页面 该怎么办 redirect url 始终是配置的
  • 在 JUnit 测试中模拟按键

    我完全陷入了java测试 它是通过测试方法将字符 a 发送到 JFrame 组件的 JTextField JFrame 类实现 KeyListener 接口 因此覆盖 KeyPressed KeyTyped 和 KeyReleased 与此
  • 如何更改主机名解析,如 coredns 中的主机文件

    我有一个像这样的核心文件配置 53 errors health lameduck 5s ready kubernetes cluster local in addr arpa ip6 arpa pods insecure fallthrou
  • InputStream 不会关闭,或者需要很长时间才能关闭

    我正在尝试将外部 mp3 下载到内部存储中 但是 我尝试下载的文件很大 因此我尝试以 1MB 的块下载它们 以便您可以在下载其余文件的同时开始播放它们 这是我的流代码 InputStream is null OutputStream os