我想从一些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();
}
请尝试解释你的答案,我是新手
答案 0 :(得分:2)
你需要告诉它可以读取多少字节。这是为了防止read()方法将数据复制到内存中,而不应该复制数据。因此,您应该传递buffer
的大小。在上面的代码中,这将是1024.您可能希望使用private static int BUFFER_SIZE = 1024
并在new
和read()
中使用此常量,以便在您更改缓冲区的大小时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。本课程设计完美,符合您的要求。