在java中对于文件的下载,最基本的就是对于流的操作。当然在android中也是如此。为了进行文件的下载,构建一个简单的web项目,利用tomcat作为服务器。
这是web项目的目录结构,主要就是对1.txt文件的下载实现。
对于主界面只是简单提供了两个按键。
当点击FileLoadMp3时,会自动下载1.txt文件到指定目录。查看按键的click事件:
@Override
public void onClick(View v) {
HttpDownload downLoad=new HttpDownload();
FileUtils fileUtils=new FileUtils();
String urls="http://1xx.1x.1xx.2xx:8080/RegisterUser/1.txt";
try {
fileUtils.write2SDFormInput("lo","1.txt", downLoad.getInputStreamFromUrl(urls));
} catch (IOException e) {
e.printStackTrace();
}
}
可以看到在响应事件中,有两个新的类,一个是HttpDownload,一个是FileUtils。对于第一个类,主要是利用他的一个方法即getInputStreamFromUrl,利用传入的url得到目标对象的输入流。
而FIleUtils则是在得到输入流的基本上,将其构造成文件,并写回到sdcard中去。
public InputStream getInputStreamFromUrl(String urls) throws IOException {
URL url = new URL(urls);
HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
return urlcon.getInputStream();
}
很简单,利用URL可以很方便的得到对应的输入流。关键是对于异常的一些处理。从而可以增加用户体验。
public File write2SDFormInput(String path,String filename,InputStream input){
File file=null;
FileOutputStream fos=null;
createSDDir(path);
file=createFileInSDCard(filename, path);
System.out.println("FileName="+file.getName());
try {
fos=new FileOutputStream(file);
byte buffer[]=new byte[4*1024];
int temp=0;
while((temp=input.read(buffer))!=-1){
fos.write(buffer, 0, temp);
}
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}return file;
}
以上方法即是将流写入到文件中去,path为路径,filename为文件名,input为输入流。
为了得到sdcard的根目录,可以采用
SDCardRoot=Environment.getExternalStorageDirectory().getAbsolutePath()+"/";
这条语句得到。如在我手机则得到/storage/sdcard0/
public File createFileInSDCard(String filename,String dir){
File temp=new File(SDCardRoot+dir+File.separator+filename);
try {
System.out.println("createFileInSDCard---"+temp);
temp.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return temp;
}
public File createSDDir(String dir){
File temp=new File(SDCardRoot+dir+File.separator);
// System.out.println(temp.mkdirs());
temp.mkdirs();
return temp;
}
创建目录,和文件,以供写入输入流。
最终下载成功。
程序还有诸多不完善的地方,比如文件名是以参数得到的,而不是程序自动获取。留给读者自己完善吧。