【发布时间】:2013-07-30 19:06:08
【问题描述】:
我正在使用 Amazon S3 并想上传一个 InputStream(这需要计算我发送的字节数)。
public static boolean uploadDataTo(String bucketName, String key, String fileName, InputStream stream) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1];
try {
while (stream.read(buffer) != -1) { // copy from stream to buffer
out.write(buffer); // copy from buffer to byte array
}
} catch (Exception e) {
UtilityFunctionsObject.writeLogException(null, e);
}
byte[] result = out.toByteArray(); // we needed all that just for length
int bytes = result.length;
IO.close(out);
InputStream uploadStream = new ByteArrayInputStream(result);
....
}
有人告诉我一次复制一个字节效率非常低(对于大文件来说很明显)。我不能做得更多,因为它会为ByteArrayOutputStream 添加填充,我无法删除它。我可以从result 中删除它,但我怎样才能安全地做到这一点?如果我使用 8KB 缓冲区,我可以只去掉最右边的 buffer[i] == 0 吗?还是有更好的方法来做到这一点?谢谢!
在 Windows 7 x64 上使用 Java 7。
【问题讨论】:
-
没有“填充”。这里的问题是你在 writing 垃圾,在对
write()的调用中不包含“count”参数。 -
@EJP 我现在解决了我的问题,但我不认为我在写无法解释的垃圾。字节缓冲区将填满 InputStream 允许的大小,而数组中的所有其他值都设置为 0(我相信默认 Java 变量值)。因此,我会收到文本,然后是一百万
NUL或 '\0',这不正确吗?
标签: java amazon-s3 stream bytearray