我对android非常陌生,我只是在摸摸它的表面。当我浏览一些教程时,我碰到了这个类来下载文件。我能够理解其他代码,但无法理解
private static final int MEGABYTE = 1024 * 1024;
是吗?这真的有必要吗?如果未声明为“第一”怎么办。
下面是代码
public class FileDownloader {
private static final int MEGABYTE = 1024 * 1024;
public static void downloadFile(String fileUrl, File directory){
try {
URL url = new URL(fileUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
//urlConnection.setRequestMethod("GET");
//urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(directory);
int totalSize = urlConnection.getContentLength();
byte[] buffer = new byte[MEGABYTE];
int bufferLength = 0;
while((bufferLength = inputStream.read(buffer))>0 ){
fileOutputStream.write(buffer, 0, bufferLength);
}
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这一定是一个非常愚蠢的问题,但我真的很好奇知道如何以及为什么?
谢谢。
答案 0 :(得分:3)
MEGABYTE = 1024 * 1024
在MB
中的平均字节数,称为兆字节
8 bits = 1 byte
1024 bytes = 1 kb
1024 kb = 1 Mb
,并且1 Mb包含1048576
。等于1024 * 1024
inputStream.read
将尝试从流中读取此数量的字节并将其放入字节数组中
data_read_as_byte return
> 0 number of bytes read
< 0 -1
// return 0 when passed array size is 0
答案 1 :(得分:1)
/*
object.price1 = 10.0
object.price2 = 9.9
object.price3 = 8.9
object.price4 = 10.1
object.name = "banana"
object.type = "fruit"
object.quantitySold = 0
object.dateIntroduced = ""
*/
let banana = object()
for property in banana {
object.property = property*2
}
声明意味着将该值声明为常量。它没有什么特别的,将硬编码的值作为常量只是一种很好的编码实践。出于代码可读性和可维护性的目的。
您的代码基本上是在创建 1 MB的缓冲区来下载文件。
这意味着在下载文件时,首先将1 MB下载到您的RAM中,然后将该部分复制到文件输出流(磁盘)中,并将重复此过程,直到下载完所有内容为止。请注意,如果所有内容都已下载到RAM,则设备可能会用完内存,并且应用会抛出private static final
。另请注意,您可以为缓冲区选择任何值而不是1 MB。
答案 2 :(得分:1)
private static final int MEGABYTE = 1024 * 1024;
是吗?
声明了一个变量final
,private
和static
它必须要做的是,您可以在MEGABYTE
类(FileDownloader
)的任何方法中引用because it is private
变量,无论是static
还是not
如果它有declared inside any method
,则scope
仅在该方法之内。
如果将其作为declared without static
关键字,则将无法通过static
方法进行访问。您可以通过删除static
关键字来自己尝试。
这真的有必要吗?如果未声明为“第一”怎么办。
在给定的类中,只有一个static method
且此变量被声明为private
,因此以这种方式声明它没有多大意义。在您的方法中声明此变量也应该很好
实例化MEGABYTES
小于INTEGER.MAX_VALUE
应该没问题