我如何在InputStream的read方法中计算byteCount

时间:2014-07-07 10:07:31

标签: java android io inputstream

我想从一些offSet通过InputStream下载文件, 我知道我可以通过InputStream的read方法来做到这一点,但它需要一个参数byteCount 但我不知道如何计算读取方法的byteCount

我的代码是

         try {
                URL url;
                url = new URL(uri);
                HttpURLConnection c = (HttpURLConnection) url
                        .openConnection();
                c.setConnectTimeout(1000000);
                c.connect();
                int lenghtOfFile = c.getContentLength();
                Log.i("fileSize", lenghtOfFile + "");
                File file = new File(
                        Environment.getExternalStorageDirectory() + "/"
                                + Environment.DIRECTORY_DOWNLOADS);
                file.mkdirs();
                File outputFile = new File(file, "4k1.jpg");
                FileOutputStream fos = new FileOutputStream(outputFile);
                Log.v("Place", "trying...");
                InputStream is = c.getInputStream();
                Log.v("errorPart", c.getURL().toString());
                if (c.getURL().toString().contains("404"))
                    Log.v("Error", "404 Error");
                Log.v("Place", "1st attempt success");
                byte[] buffer = new byte[1024];
                int len1 = 0;
                Log.v("Place", "Download started!");
                int on = 0;
                    while ((len1 = is.read(buffer)) != -1) {
                        fos.write(buffer, 0, len1);
                        Log.v("is", "running "  + len1);
                    }
                Log.v("Place", "Download Finished!");
                fos.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }    

请尝试解释你的答案,我是新手

4 个答案:

答案 0 :(得分:2)

你需要告诉它可以读取多少字节。这是为了防止read()方法将数据复制到内存中,而不应该复制数据。因此,您应该传递buffer的大小。在上面的代码中,这将是1024.您可能希望使用private static int BUFFER_SIZE = 1024并在newread()中使用此常量,以便在您更改缓冲区的大小时t忘记将参数更改为read()函数。

private static final int BUFFER_SIZE = 1024;

...

byte[] buffer = new byte[BUFFER_SIZE];
int len1 = 0;
Log.v("Place", "Download started!");
int on = 0;
while ((len1 = is.read(buffer,0,BUFFER_SIZE)) != -1) {
    fos.write(buffer, 0, len1);
    Log.v("is", "running "  + len1);
}

...

答案 1 :(得分:0)

您并非真的需要为读取方法提供 byteCount 。使用is.read(buffer))只会在每一轮读出 1024字节(因为由缓冲区数组的长度定义),直到返回 -1

答案 2 :(得分:0)

无法从HttpURLConnection直接访问文件大小您可以在文件流下使用nio缓存在一次性生成的文件中。

答案 3 :(得分:0)

为什么不直接使用班级CountingInputStream, provided by Apache。本课程设计完美,符合您的要求。