试图以块的形式上传

时间:2011-05-08 08:57:32

标签: java blackberry java-me https multipartform-data

我正在尝试在黑莓上完成大型文件上传。我成功上传了一个文件,但只有当我读取文件并一次上传1个字节时。对于大文件,我认为这会降低性能。我希望能够一次读取和写入更多128 kb的内容。如果我尝试将缓冲区初始化为1以外的任何内容,那么在写完所有内容之后,我永远不会从服务器返回响应。

为什么我一次只能使用1个字节上传的任何想法?

z.write(boundaryMessage.toString().getBytes());
DataInputStream fileIn = fc.openDataInputStream();
boolean isCancel = false;

byte[]b = new byte[1];
int num = 0;
int left = buffer;

while((fileIn.read(b)>-1))
{
  num += b.length;
  left = buffer - num * 1;
  Log.info(num + "WRITTEN");

  if (isCancel == true)
  {
    break;
  }

  z.write(b);
}
z.write(endBoundary.toString().getBytes());

3 个答案:

答案 0 :(得分:1)

这是OS OS 5.0中出现的BlackBerry OS中的一个错误,并且仍然存在于OS 6.0中。如果您尝试在OS 5之前使用多字节读取,它将正常工作。 OS5及更高版本会产生您描述的行为。

您也可以通过创建安全连接来解决问题,因为错误不会表现为安全套接字,只有普通套接字。

答案 1 :(得分:0)

你的循环不正确。你应该注意读取的返回值。它返回实际读取的字节数,并且不总是与缓冲区大小相同。

编辑: 这就是你通常编写做你想做的循环的方法:

OutputStream z = null;  //Shouldn't be null
InputStream in = null;  //Shouldn't be null
byte[] buffer = new byte[1024 * 32];
int len = 0;
while ((len = in.read(buffer)) > -1) {
    z.write(buffer, 0, len);
}

请注意,您可能希望使用缓冲流而不是无缓冲流。

答案 2 :(得分:0)

大多数输入流都不能保证在每次读取时填充缓冲区。 (DataInputStream有一个特殊的方法readFully(),如果流中没有足够的字节来填充缓冲区,它将抛出EOFException。除非文件是缓冲区长度的倍数,最终读取时没有流将填充缓冲区。因此,您需要存储读取的字节数并在写入期间使用它:

while(!isCancel)
{
  int n = fileIn.read(b);
  if (n < 0)
    break;
  num += n;
  Log.info(num + "WRITTEN");
  z.write(b, 0, n);
}