一、 使用HTTP协议下载文件
1、文件下载步骤
1)、创建一个HttpURLConnection对象
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
2)、获得一个InputStream对象
urlConn.getInputStream();
3)、访问网络的权限
<uses-permission android:name="android.permission.INTERNET" />
二、将下载的文件写入SDCard
1、得到当前SDCard卡的目录
Environment.getExternalStorageDirectory()
2、访问SDCard卡的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
程序:
public class DownLoadActivity extends Activity {
private Button downloadFileBtn,downloadmp3Btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
downloadFileBtn = (Button) findViewById(R.id.downloadfile);
downloadmp3Btn = (Button) findViewById(R.id.downloadmp3);
downloadFileBtn.setText("下载 文件");
downloadmp3Btn.setText("下载MP3");
downloadFileBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
HttpDownLoader httpDownLoader = new HttpDownLoader();
String txt = httpDownLoader.downLoad("http://127.0.0.1:8080/st/myTest.txt");
System.out.println(txt);
}
});
downloadmp3Btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
HttpDownLoader httpDownLoader = new HttpDownLoader();
int downlaodResult = httpDownLoader.downLoadFile("http://127.0.0.1:8080/st/music1.mp3", "TaylorSwift/", "lovestory.mp3");
System.out.println(downlaodResult);
}
});
}
}
以下是两个帮助类
public class FileUtils {
//得到当前外部存储设备的目录,得到的目录名/SDCARD
private String SDPATH;
public String getSDPATH() {
return SDPATH;
}
public FileUtils(){
SDPATH = Environment.getExternalStorageDirectory() + "/";
}
//在SDCard上创建文件
public File createSDFile(String fileName) throws IOException{
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
}
//在SDCard上创建目录
public File createSDDir(String dirName){
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
}
//判断SDCard上的文件是否存在
public boolean isFileExist(String fileName){
File file = new File(SDPATH + fileName);
return file.exists();
}
//将一个InputStream里面的数据写入到SDCard卡中
public File write2SDFromInput(String path,String fileName,InputStream input){
File file = null;
OutputStream output = null;
try {
createSDDir(path);
file = createSDFile(path + fileName);
output = new FileOutputStream(file);
byte[] buffer = new byte[4 * 1024];
while((input.read(buffer)) != -1){
output.write(buffer);
}
output.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
output.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return file;
}
}
public class HttpDownLoader {
private URL url = null;
/**
* 根据URL下载文件,前提是这个文件的内容是文本,函数的返回值就是文件的内容
* @param urlStr
* @return
*/
public String downLoad(String urlStr){
StringBuffer stringBuffer = new StringBuffer();
String line = null;
BufferedReader buffer = null;
try {
//创建一个URL对象
url = new URL(urlStr);
//创建一个Http连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//使用IO流读取数据
buffer = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
while((line = buffer.readLine()) != null){
stringBuffer.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
buffer.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
System.out.println(stringBuffer.toString());
return stringBuffer.toString();
}
//该函数返回整形 -1:代表出错 0:代表成功 1:代表文件已经存在
public int downLoadFile(String urlStr,String path,String fileName){
InputStream inputStream = null;
try {
FileUtils fileUtils = new FileUtils();
if(fileUtils.isFileExist(path + fileName)){
return 1;
}else{
inputStream = getInputStreamFromUrl(urlStr);
File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
if(resultFile == null){
return -1;
}
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}finally{
try {
inputStream.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return 0;
}
//根据URL得到一个输入流
public InputStream getInputStreamFromUrl(String urlStr) throws IOException{
url = new URL(urlStr);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConn.getInputStream();
return inputStream;
}
}