从ByteArrayOutputStream修剪填充



我正在使用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();

相关内容

  • 没有找到相关文章

最新更新