答案 0 :(得分:4)
答案 1 :(得分:2)
这可能有点迟了,但我最近一直在研究一些我需要知道 读取的字节数的东西,而不是剩下多少要阅读,正如这个问题所要求的那样。但你可以从我得到的解决方案中得出这个数字。我想知道读取的字节数,以便我可以监控下载的进度(如果需要一段时间)。
我最初只是使用DataInputStream#readFully()来下载文件。
buffer = new byte[length];
in.readFully(buffer);
但有时我会等待50到60秒的任何时间下载完成,具体取决于尺寸。我想获得有关事情进展的实时更新,因此我改为仅使用常规DataInputStream #read(byte [] b,int off,int len)。因此,最后有一个System.out告诉我每当我跳过一个百分点时:
buffer = new byte[length];
int totalRead = 0;
int percentage = 0;
while (totalRead < length)
{
int bytesRead = in.read(buffer, totalRead, (length - totalRead));
if (bytesRead < 0)
throw new IOException("Data stream ended prematurely");
totalRead += bytesRead;
double progress = ((totalRead*1.0) / length) * 100;
if ((int)progress > percentage)
{
percentage = (int)progress;
System.out.println("Downloading: " + percentage + "%");
}
}
要知道要读取多少字节,可以对最后一个示例进行一些小的修改。使用跟踪器变量代替我的百分比,例如:
buffer = new byte[length];
int totalRead = 0;
int bytesLeft= 0;
while (totalRead < length)
{
bytesLeft = length - totalRead;
int bytesRead = in.read(buffer, totalRead, bytesLeft);
if (bytesRead < 0)
throw new IOException("Data stream ended prematurely");
totalRead += bytesRead;
System.out.println("Bytes left to read: " + bytesLeft);
}
答案 2 :(得分:2)
这是一个相当古老的问题,但我会发布我的解决方案,因为它可能有助于某人:
Apache Commons IO中实际上有一个方便的CountingInputStream包装器 http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CountingInputStream.html
它源自 java.io.FilterInputStream ,因此您基本上可以将其包装在任何标准输入流中。
在您的情况下,假设 dataInputStream 变量表示您使用的流:
CountingInputStream counter = new CountingInputStream( dataInputStream );
dataInputStream = new DataInputStream( counter );
...
counter.getByteCount() //this returns num of bytes read from dataInputStream
答案 3 :(得分:1)