public void download3(String a,String d){
String s1 = "http://58.177.123.82:9080"+a;
InputStream is = null; //定义一个输入流。
BufferedInputStream bis = null;//定义一个带缓冲的输入流 。
try{
URL url = new URL(s1);//创建一个URL对象。
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
System.out.println();
conn.setDoInput(true);
conn.connect();
is = conn.getInputStream();//打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
bis = new BufferedInputStream(is);
}catch(Exception e){
System.out.println(e.toString());
}
//写到本地
BufferedOutputStream bos = null; //定义一个带缓冲的输出流。
File file = new File("/sdcard/"+d);
System.out.println(file.exists());
if (file.exists()){
Toast.makeText(Reader5.this, "sorry! the file is exists", Toast.LENGTH_LONG).show();
}
else{
try{
bos = new BufferedOutputStream(new FileOutputStream(file));;
int num = -1;
byte[] buffer = new byte[1024];
while (true) {
num = bis.read(buffer);
if (num == -1) {
bos.flush();
break;
}
bos.write(buffer, 0, num);
bos.flush();
}
bos.close();
bis.close();
bos = null;
bis = null;
if( file.exists()){
Toast.makeText(Reader5.this, "download success!", Toast.LENGTH_LONG).show();
}
}catch(Exception e){
}
}
}
这段代码是Java实现的一个简单的HTTP文件下载功能,主要涉及到网络编程和文件操作。下面将详细解释其中的关键知识点:
1. **URL与HttpURLConnection**:
- `URL`(Uniform Resource Locator)类是Java中用于表示统一资源定位符的类,它提供了访问网络资源的方法。在代码中,通过构造函数`new URL(s1)`创建了一个URL对象,`s1`是文件的网络地址。
- `HttpURLConnection` 是Java中的一个抽象类,它是`URLConnection`的子类,用于处理HTTP协议。在这里,通过`url.openConnection()`创建了一个`HttpURLConnection`实例`conn`。
2. **设置请求属性**:
- `conn.setDoInput(true)` 设置允许从服务器获取数据,这对于下载文件是必要的。
- `conn.connect()` 连接到指定的URL,开启与服务器的通信。
3. **获取输入流并进行缓冲**:
- `conn.getInputStream()` 获取从服务器到本地的输入流,用于读取服务器返回的数据。
- `BufferedInputStream bis = new BufferedInputStream(is)` 创建一个带缓冲的输入流,提高数据读取效率。
4. **文件操作**:
- `File file = new File("/sdcard/" + d)` 创建一个`File`对象,表示要保存的本地文件路径。这里假设文件保存在SD卡上。
- `file.exists()` 检查文件是否已存在。如果存在,会显示提示信息。
5. **文件写入**:
- `BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))` 创建一个带缓冲的输出流,用于向文件写入数据。
- 使用`while`循环从`bis`读取数据到缓冲区`buffer`,然后通过`bos.write(buffer, 0, num)`将缓冲区内容写入文件。当`bis.read(buffer)`返回-1时,表示文件结束,调用`bos.flush()`清空缓冲区并结束写入。
- 关闭流并释放资源,同时检查文件是否存在,如果存在则显示下载成功的提示。
6. **异常处理**:
- 在整个过程中,代码使用了`try-catch`语句来捕获可能出现的异常,如网络问题、文件操作错误等。捕获到异常时,会打印异常信息,但没有进行具体的错误处理。
这段代码实现了从指定的URL下载文件并保存到本地的功能,使用了HTTP连接、输入/输出流以及缓冲技术。在实际应用中,可能还需要添加更多的异常处理和错误反馈机制,以及对网络状态的检查。