通过Java InputStream获取文件的字节数

3

正如标题所述,我需要知道InputStream“后面”的文件有多少字节。

我不想下载所有字节然后计算(太耗时间)。我只需要知道文件有多少字节。

像这样:

int numberOfBytes = countBytes(inputStream);

因此,我需要一个实现 countBytes(InputStream inputStream) 的方法。


请看这篇文章:https://dev59.com/5nVD5IYBdhLWcg3wBWvd - Mike Yockey
1
你有文件的访问权限,还是只有它的InputStream? - Todd
@Todd,我只能通过Javamail API获取到一个流,它指的是IMAP服务器上电子邮件的附件。 - Timo Ernst
@yock 那样做没有帮助。你发布的链接是关于从File实例中获取大小的。我只有流。 - Timo Ernst
2个回答

8
除了消耗整个流并计算字节之外,您无法进行此操作(没有相应的API)。
虽然有 available() 方法,但是它明确不会返回您要求的内容:
请注意,尽管某些InputStream的实现将返回流中的总字节数,但许多实现可能不会这样做。
如果InputStream与文件相关联(而不是套接字),也许您可以使用其他API获取其大小?

不,我认为这是一个套接字。输入流是通过Javamail附加电子邮件的一部分。 - Timo Ernst
嗨@Timo,你找到其他解决方案了吗? - StrawhatLuffy
@StrawhatLuffy 抱歉,那是很久以前的事了,我记不清了 :-) - Timo Ernst

2
你能利用skip()方法来近似计算文件的大小吗?
int bytes = 1024; // Chunk size for skipping. Adjust as necessary
try {
    int skipped = 0;
    while(stream.available()) {
        stream.skip(bytes);
        skipped += bytes;
        // Elided...do something with skipped
    }
} catch(IOException ex) {
    // Handle a skip that's too big
}

我相信你可以让这个循环更加智能,避免不可避免的IOException,但这是留给读者的练习。

正如我之前所说,我需要确切的字节大小。 - Timo Ernst
那么你可以一次跳过一个字节吗?为什么需要知道确切的大小? - Mike Yockey
我正在将文件上传到Dropbox,它的API需要我上传的确切字节数。 - Timo Ernst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接