Java 文件下载挂起

2023-12-13

我有一个用于下载文件的网络界面。当请求到来时,我的 glassfish 服务器从 Web 服务流式传输文件,然后将内容写入输出流。我的代码工作正常,除非文件大小变得非常大(例如超过 200 MB),它会挂起,在浏览器中显示 0% 下载,并且文件从未下载。

当我将flush()方法移到while循环内时,它也适用于大文件。我不确定将flush()放入循环中是否有问题。不确定这东西实际上是如何工作的。我的代码如下:

HttpURLConnection conn = (HttpURLConnection) downloadUri.toURL().openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-Type", "application/pdf");
        if (conn.getResponseCode() == 200) {
            ServletOutputStream output;
            try (InputStream inputStream = conn.getInputStream()) {
                HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Length", conn.getHeaderField("Content-Length"));
                response.setHeader("Content-Disposition", "attachment; filename=\"" + abbr + ".pdf\"");
                output = response.getOutputStream();
                byte[] buffer = new byte[1024];
                int bytesRead;                    
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    output.write(buffer, 0, bytesRead);                        
                }
            }                 
            output.flush();
            output.close();

有什么想法吗?。感谢您对此进行调查。


lush() 方法指示流实际将输出发送到流管道中。

由于各种性能原因,各种流实现可以缓存输出,而不是立即写入底层流。

例如,将 IO 操作保存在磁盘上,从性能角度来看,这非常昂贵。

如果不是为了性能,刷新流是没有问题的,在本例中这正是您想要的:在您刷新它之前,流似乎会被卡住,因此您希望它实际将内容发送到客户端。

也许您可以调整缓冲区的大小(大于 1024),看看哪个更适合。

EDIT :

在循环中或不在循环中刷新的问题相对不相关。

您可以随时调用flush,正如所说的那样,它将调用底层操作系统流,这是否会影响性能取决于具体情况。

例如,您可以认为流缓冲文件的 200MB RAM 比 IO 操作更重要,而且在性能方面也是如此。

或者更简单地说,重视看到文件实际下载的用户体验比您可能遇到的最终性能影响更重要(如果您设法衡量它)。

如前所述,缓冲区越大,循环问题就越少。作为一个极端的例子,假设您的缓冲区为 100 MB,那么 80 MB 的文件将仅获得一次刷新,无论如何它都会在请求结束时获得。

1k 的缓冲区可能太小,4k 更好,16k 更好,这是 IO 调用和 RAM 消耗之间的权衡。

流本身应该做正确的工作,但是如果您看到 200MB 文件被完全缓存,除非您调用刷新,那么显然流可能正在优化性能,但提供了糟糕的用户体验,所以显然您需要在循环中使用它。

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

Java 文件下载挂起 的相关文章

  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 使用 JAVA 从 CSV 更新 MySQL

    我的问题如下 CSV 文件按照给定的时间间隔从服务器下载 必须解析文件 必须删除不必要的空格 必须为每个条形码更新商品价格 建议零售价和库存数量 每个 CSV 行包含商品编号 产品标题 仓库 ID 仓库名称 价格 RRP 价格 库存和条形码
  • 在 Spring Batch 中的多线程步骤中写入 StepExecutionContext

    我正在使用 Spring Batch 并且创建了一个使用SimpleAsyncTaskExecutor 在这一步中 我正在检索StepExecutionContext with BeforeStep public void saveStep
  • 带有限制关键字的 typedef

    我这样定义对齐浮动 typedef attribute aligned 64 float aligned float 然后我定义对齐的浮动restrict像这样的关键字 typedef aligned float restrict alig
  • 使用 LINQ 时从字符串访问 lambda 表达式中的属性

    我怎样才能做这样的事情 var result db MyTable Where x gt x MyProperty Test 如您所见 我想访问 MyProperty 但将属性名称作为字符串提供 你可以使用反射 x GetType GetP
  • 在 Chrome 扩展中具有面板行为

    我需要在 Chrome 中具有面板行为 总是在顶部的东西 但不会损害导航 除了屏蔽一些像素之外的任何其他方式 目前我们有两个选择 面板模式下的窗口 尚不可用 尽管现在可供GTalk 扩展 弹出模式下的窗口 我可以通过在每个事件中重新聚焦来使
  • Java 中的 Sprintf 等效项

    Printf 在 1 5 版本中被添加到 Java 中 但我似乎找不到如何将输出发送到字符串而不是文件 这就是 sprintf 在 C 中所做的 有谁知道如何做到这一点 Store the formatted string in resul
  • document.getElementByID 在 IE 8 中不起作用

    我以前从未这样做过 所以如果我没有足够好地描述我的问题或没有使用所有正确的语法 我深表歉意 我的网站上有一个电子邮件表格 用户可以输入消息以及他们的姓名和一些其他数据 一旦他们填写完表格 他们就可以提交它 它会发送到我的电子邮件 一切都很好
  • Python:如何将元组值的字典写入 csv 文件?

    如何将以下词典打印到 csv 文件中 maxDict test1 alpha 2 test2 gamma 2 因此 输出 CSV 如下所示 test1 alpha 2 test2 gamma 2 import csv with open d
  • 在 WebGL 上访问图像/纹理数据(纹素)

    我在 WebGL 上有以下代码片段 var texture gl createTexture texture image new Image texture image onload function I want to read the
  • 使用java反射获取包名称

    我想从一个单独的 Java 项目中获取所有包名称 在 Java 中如何最好使用反射来实现此操作 我已将项目导入到我的构建路径中 并尝试使用下面的代码来获取包名称 Package pack Package getPackages 编辑 我没有
  • 使用 Blogger API 获取的帖子数量限制(错误 400)

    我正在尝试使用 Blogger API 从博客中获取所有帖子 由于某些未知原因 要获取的最大帖子数似乎被限制为 20 个 如果我尝试这个网址 我收到以下回复 按预期列出最后 20 个帖子标题 items title El Caballero
  • 为什么 Bootstrap CSS 没有在其他项目中使用相同的代码覆盖?

    我有这样的问题 我正在处理项目 但是当我从服务器复制相同的文件时 它看起来有所不同 某些 Bootstrap 样式未被覆盖 这是工作站点标题的屏幕截图 以及在我的计算机上打开同一项目时看到的内容 我查看了 Firebug 发现该活动链接使用
  • UIPageViewController:pageViewController:spineLocationForInterfaceOrientation:未调用

    我的spineLocationFor InterfaceOrientation方法没有被调用 因此 脊柱总是在左边 但我想把它放在中间 我做错了什么 if UIPageViewController class self pageViewCo
  • 在CodeIgniter中检查update_batch()是否成功

    我正在 CodeIgniter 中的表上运行 update batch 我想检查它是否成功 我尝试过使用affected rows 但这只计算已修改的表单字段的数量 因此并不能完全减少它 this gt db gt update batch
  • 防止其他类实例化类

    我正在使用域 视图和控制器 每个都包含自己的类 该域包含许多不应在域外的类中实例化的类 我的印象是默认访问修饰符会对我有所帮助 使我的域类的构造函数包可见 事实证明 在导入正确的 package class 文件后 任何类仍然可以使用构造函
  • 如何让多边形填满屏幕宽度的 80%?

    我有一个简单的正方形 多边形 我希望它填充 80 屏幕宽度 换句话说 我想将正方形放置在 屏幕中央 但宽度为总宽度的80 屏幕的 我该怎么做 我找不到关于此的示例 教程 thanks 这是我的广场的代码 public class Squar
  • Fortran MPI 代码中的标准输出

    我有一个并行的 fortran 代码 其中我只希望rank 0进程能够写入标准输出 但我不想在代码中乱七八糟 if rank 0 write 所以我想知道这样做是否是一个好主意 或者是否有更好的方法 program test use mpi
  • 如何诊断 .NET Core 5 中的 CORS 问题?

    我遇到了 CORS 问题 如果我允许任何方法 任何来源和任何标头 一切都会正常工作 但当我限制其中任何一个时 浏览器控制台会立即变成红色 我已经解决了我的问题 这是由于环境变量不好 但这是一个相当乏味的试错过程 有没有办法诊断 NET Co
  • 如何使用第一个下拉列表中选定的值填充第二个下拉列表?

    假设我有两个下拉菜单 它们在我的 jsp 加载时填充
  • Java 文件下载挂起

    我有一个用于下载文件的网络界面 当请求到来时 我的 glassfish 服务器从 Web 服务流式传输文件 然后将内容写入输出流 我的代码工作正常 除非文件大小变得非常大 例如超过 200 MB 它会挂起 在浏览器中显示 0 下载 并且文件