我正在使用AmazonS3,希望上传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。
您可以这样做:
int read = 0;
while ((read = stream.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
CCD_ 4返回已写入CCD_ 5的字节数。您可以将此信息传递给out.write()
的len
参数。因此,您要确保只写入从流中读取的字节。
使用Jakarta Commons IOUtils在一步中从输入流复制到字节数组流。它将使用高效的缓冲区,并且不会写入任何多余的字节。
如果你想要效率,你可以在阅读文件时处理它。我会用stream
替换uploadStream
,并删除其余的代码。
如果你需要一些缓冲,你可以做这个
InputStream uploadStream = new BufferedInputStream(stream);
默认的缓冲区大小是8KB。
如果您想要长度,请使用File.length();
long length = new File(fileName).length();