时间:2010-07-24 11:13:41

标签: java java-me

4 个答案:

答案 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)