我正在尝试在黑莓上完成大型文件上传。我成功上传了一个文件,但只有当我读取文件并一次上传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());
答案 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);
}