【发布时间】:2010-03-31 18:43:58
【问题描述】:
我有一个用于将文件上传到服务器的 java 小程序。
我想显示已发送数据的百分比,但是当我使用ObjectOutputStream.write() 时,它只是写入缓冲区,不会等到数据实际发送完毕。我怎样才能做到这一点。
也许我需要使用线程同步之类的。任何线索都会很有帮助。
【问题讨论】:
-
查找执行此操作的现有代码。不要写你自己的
我有一个用于将文件上传到服务器的 java 小程序。
我想显示已发送数据的百分比,但是当我使用ObjectOutputStream.write() 时,它只是写入缓冲区,不会等到数据实际发送完毕。我怎样才能做到这一点。
也许我需要使用线程同步之类的。任何线索都会很有帮助。
【问题讨论】:
不要使用ObjectOutputStream。它用于编写序列化的 Java 对象,而不是用于编写原始二进制数据。它确实可能会阻塞流。而是直接写到 URL 连接的OutputStream。
也就是说,代码看起来相当复杂。即使重读了几遍,眨了无数次的眼睛,我也无法正确理解。我建议您在Commons HttpClient 的帮助下根据multipart/form-data 编码发送这些文件。你可以找到here 一个基本的代码示例。您只需修改Part[] parts 以包含所有文件。另一端的 servlet 可以反过来使用Commons FileUpload 来解析multipart/form-data 请求。
要计算进度,我建议从Commons IO 中选择CountingOutputStream。只需将OutputStream 包裹起来并写入即可。
更新:如果您不喜欢将您的小程序与更多的 3rd 方库一起发布(我认为这是合理的),那么请查看 this code snippet(以及提到的原始问题为第一个链接)如何使用URLConnection 自己创建multipart/form-data 正文。
【讨论】:
ObjectOutputStream 的本质。它不能逐字节发送数据,它只能以块/对象的形式发送数据。要么接受它,要么放弃它,继续发送“正常”的 HTTP 多部分/表单数据请求。
我正在寻找的实际上是:
setFixedLengthStreamingMode(int contentLength)
这可以防止任何内部缓冲,让我确切知道正在发送的数据量。
【讨论】: