我有一个功能:
public byte[] convertFileToBytes(String path) throws IOException {
FileInputStream fis = new FileInputStream(path);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
for (int readNum; (readNum = fis.read(b)) != -1;) {
bos.write(b, 0, readNum);
}
byte[] bytes = bos.toByteArray();
return bytes;
}
负责将文件转换为字节。鉴于某些文件很大,因此转换需要花费时间,我如何确定该函数执行期间的进度,即,如何测量从要转换的文件的第一个字节到最后一个字节的进度,以便在其中显示确定的进度条?
答案 0 :(得分:1)
使用AsyncTask,OnProgressUpdate非常适合
private class convertFileToBytes extends AsyncTask<String, Integer, byte[]> {
FileInputStream fis = new FileInputStream(path);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int byteLength = (fis.available() / b.length) + 1);
int increment = 0;
@Override
protected byte[] doInBackground(String... params) {
for (int readNum; (readNum = fis.read(b)) != -1;) {
bos.write(b, 0, readNum);
++increment;
publishProgress((increment/byteLength)*100);
}
byte[] bytes = bos.toByteArray();
return bytes;
}
@Override
protected void onPostExecute(byte[] result) {
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Integer... progress) {
Log.d("progress",Integer.valueOf(progress));
}
}
答案 1 :(得分:0)
您可以简单地在循环内访问进度,例如:
if (readNum%1000) cerr << readNum*100/totalNum << "% done\n";
请注意,您必须先查找文件(totalNum
)的总大小。 %1000
只会每读取1000次,而不是每次写入一次。
还要注意,任何输出都会减慢执行速度,因此通过向用户通知进度,速度会变慢。