Java outputstream 有可以实现 append 的方式吗?

发布于 2022-09-11 14:41:16 字数 722 浏览 22 评论 0

大家好,我遇到了一个问题。

更新下:其实 outputstream.write 就是附加操作,而不是重写。举例来说,第一次 write 并且 flush 以后,后面再 flush 也能推送到客户端,而且是追加。我的问题是,后面追加的操作没能写入到第一次生成的 excel 中。在资源管理器中看文件大小是 28kb,打开后再关闭就变成了 8kb。


原问题:

客户端想要下载 excel 文件,我从数据库里找到,然后用 apache poi 生成 byte array,设置好响应头,再传回客户端,客户端就可以下载。

问题就是,有时候生成这个 excel 的耗时比较长,浏览器没收到响应,就 504 超时了。我想着能不能生成一部分,发送一部分,这样连接就建立起来了。一直到所有的内容都生成了,再关闭连接。

我用的是 servlet.getOutputStream(),没找到类似 append 的方法,PrinterWriter 类有类似的方法,但是我试了一下,这样传回客户端的没法打开,应该是只能传二进制回去吧?我还试了一下socket,但是也需要用socket.getOutputStream(); 的方法获取输出流,这样又绕回来了。

所以来这里请教下各位,有没有其它方式能实现我这需求,还是这个需求就是不可实现的?如果有更好的方法,还请赐教。谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏了南城 2022-09-18 14:41:16

你可以先返回一个页面 就像平时下载文件的 数据处理中 下载将在一分钟后开始.... 之类的 把处理完的文件保存起来, 时间到把链接显示出来, 或者自动请求 , 然后请求来的时候把文件发过去

处理时间不长的话, 也可以试着把超时时间设长一点

从来不烧饼 2022-09-18 14:41:16

可以实现的,但是比较麻烦,因为你用poi只能得到一个outputstream,而如果想用流方式提供给客户端下载,需要有一个inputstream,所以你需要一个PipedInputStream,然后把outputstream转换为一个inputstream,然后你还需要准备一个单独的线程去实现poi的操作,否则在同一个线程里,你没办法同时对outputstream和inputstream进行操作,所以还是比较麻烦,但可以做到。代码的例子没有找到合适的,你可以看看PipedInputStream/PipedOutputStream的相关文档。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文