繁体   English   中英

DataOutputStream写入进度不准确

[英]DataOutputStream write progress not accurate

DataOutputStream wr = new DataOutputStream(
                    urlConnection.getOutputStream());
            fis = new FileInputStream(image_path);
            int total = 0;
            int bytes_read = 0;
            int buffer_size = 1024;
            byte[] buffer = new byte[buffer_size];
            bytes_read = fis.read(buffer, 0, buffer_size);
            int progress = 0;
            while (bytes_read > 0) {
                total += bytes_read;
                wr.write(buffer, 0, bytes_read);
                int bytes_available = fis.available();
                progress = (int) ((total * 100) / bytes.length);
                Log.i("asd", "direct progress: " + progress);
                buffer_size = Math.min(bytes_available, buffer_size);
                buffer = new byte[buffer_size];
                bytes_read = fis.read(buffer, 0, buffer_size);
            }
            Log.i("asd", "data written to target so far is: " + wr.size()+ " file length: "+bytes.length);
            wr.flush();
            wr.close();

将文件完全上传到服务器。 但是我的意图是获取已经上传的字节的进度。 我也可以得到(我认为这是不准确的)。 当我运行此代码时,它显示了从0到100的进度,但是文件在1分钟左右后被上传到服务器。

我尝试使用的文件小于1MB,并且进度准确。 但是,当文件较大时,我会遇到进度不准确的问题。

您的进度指示器不准确,因为您将(读取的字节数)除以(一次读取的字节数)。 这意味着您将读取次数显示为上载百分比,这是不正确的,并且仅适用于100次读取/写入中上载的文件。

您应该在开始时读取一次文件长度。 然后累积读取/写入的总字节数。 然后进度等于:

进度= 100 *写入的总字节数/文件长度

DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
fis = new FileInputStream(image_path);
int fileLength = new File(image_path).length();

int bytes_read = 0;
int bytesReadTotal = 0;
int buffer_size = 1024;
byte[] buffer = new byte[buffer_size];
int progress = 0;

while ((bytes_read = fis.read(buffer, 0, buffer_size)) > 0) {
     wr.write(buffer, 0, bytes_read);
     bytesReadTotal += bytes_read;
     progress = (int) (100.0f * bytesReadTotal / fileLength);
     Log.i("asd", "direct progress: " + progress);
}
Log.i("asd", "data written to target so far is: " + wr.size()+ " file length: "+bytes.length);
wr.flush();
wr.close();

您也不必每次想读/写东西时都重新创建缓冲区。 您可以重用旧的。

connection.setFixedLengthStreamingMode((int) requestLength);

会成功的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM