您的位置:首页 > 理论基础 > 计算机网络

android 基础 文件下载 文件操作 网络操作

2013-07-12 16:19 246 查看
其实android的文件下载和java是完全相似的,只不过有路径问题和权限问题

1.关于路径问题

通常我们将文件下载到SD卡目录下,那么如何获得SD卡目录呢?

首先我们得有权限去操作这个目录

在AndroidManifest.xml中注册权限:

<!-- 在SD卡中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 向SD卡写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

之后再java代码中判断下:

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

// 判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限

最后偶获得SD卡目录:

SDPATH = Environment.getExternalStorageDirectory();

在我测试中发现,几乎所有的手机的SD卡目录都是/sdcard/ 但不排除特殊情况,所以还是老老实实的用Environment.getExternalStorageDirectory();吧!

获得SD卡目录后就可以将得到的文件写入了,写入方法和java类似,其实可以说完全相同。

这里我封装了一些我常用的方法(写在这里的目的是为了...):

package tk.orangers.FileUtil;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.os.Environment;

import android.util.Log;

public class FileUtil {

private File SDPATH;//sd卡根目录

public File getSDPATH(){

return this.SDPATH;

}

public FileUtil(){

//得到当前外部存储设备的目录

if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

//判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限

SDPATH = Environment.getExternalStorageDirectory();

System.out.println("info:SD dir --> "+SDPATH);

}else {

System.out.println("info:it's no permission to write SD");

}

}

/**

* 在SD卡上创建文件

*

* @param fileName

* @return file

* @throws IOException

*/

public File creatSDFile(String fileName)throws IOException{

File file = new File(SDPATH.getCanonicalPath()+fileName);

file.createNewFile();

return file;

}

/**

* 在SD卡上创建目录

* @param dirName

* @return

*/

public File creatSDDir(String dirName) throws IOException{

File dir = new File(SDPATH.getCanonicalPath()+dirName);

dir.mkdir();

System.out.println("info:file dir --> "+SDPATH+dirName);

return dir;

}

/**

* 判断SD卡上的文件是否存在

* @param fileName

* @return

*/

public boolean isFileExist(String fileName) throws IOException{

File file = new File(SDPATH.getCanonicalPath()+fileName);

return file.exists();

}

/**

* 将衣蛾InputStream里面的数据写入到SD卡中

* @param path

* @param fileName

* @param input

* @return

*/

public File write2SDFromInput(String path,String fileName,InputStream input){

File file = null;

OutputStream output = null;

System.out.println("info:file full path --> "+path+fileName);

try {

creatSDDir(path);

File f = creatSDFile(path+fileName);

output = new FileOutputStream(f);

byte buffer[] = new byte[4*1024];

while((input.read(buffer))!=-1){

output.write(buffer);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

try {

if(output!=null){

output.flush();

output.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return file;

}

}

2.关于网络问题

同样的还是要判断是否有网络操作权限或者说本机有没有网络可用

ConnectivityManager connMgr = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE); //获得网络连接服务

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); //获得网络连接信息

NetworkInfo 的方法完全够你使用了 可以判断当前网络连接,网络连接信息,比如可以使用getType()方法获得网络连接类型,什么CMNET?WIFI?都死可以的

当然在这之前,你必须要获得相应的网络操作权限, 在AndroidManifest.xml中注册权限:

<!-- 访问网络权限 -->

<uses-permission android:name="android.permission.INTERNET" />

<!--访问网络状态-->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我又封装了些方法,方便我的代码编写,哈哈:

package tk.orangers.HttpDownloadUtil;

import java.io.BufferedReader;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import android.content.Context;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.util.Log;

import tk.orangers.FileUtil.FileUtil;

public class HttpDownloadUtil {

//-1:没有网络 1:WIFI网络2:wap网络3:net网络

public static final int WIFI = 1;

public static final int CMWAP = 2;

public static final int CMNET = 3;

private Context context;

public HttpDownloadUtil(Context context){

this.context = context;

}

/**

* 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap网络3:net网络

* @param context

* @return

*/

public int getAPNType() {

int netType = -1;

//获得网络连接服务

ConnectivityManager connMgr = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

if (networkInfo == null) {

return netType;

}

int nType = networkInfo.getType();

if (nType == ConnectivityManager.TYPE_MOBILE) {

Log.e("networkInfo.getExtraInfo()","networkInfo.getExtraInfo() is "+ networkInfo.getExtraInfo());

if (networkInfo.getExtraInfo().toLowerCase().equals("cmnet")) {

netType = CMNET;

}

else {

netType = CMWAP;

}

}

else if (nType == ConnectivityManager.TYPE_WIFI) {

netType = WIFI;

}

System.out.println("当前网络类型--》"+netType);

return netType;

}

/**

* 从urlStr字符串中获得网络连接,并将其InputStream返回

* @param urlstr

* @return

* @throws Exception

*/

public InputStream getInputStreamFromUrl(String urlstr) throws Exception{

InputStream inputStream = null;

if(getAPNType()>0){//先判断是否有连接

URL url = new URL(urlstr);

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

inputStream = urlCon.getInputStream();

}

return inputStream;

}

/**

* 从网络上下载一个文本型的文件 ,返回一个String类型的文本

* @param urlstr

* @return

*/

public String downTextFile (String urlstr){

StringBuffer sb = new StringBuffer();

try {

BufferedReader buffer = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(urlstr)));

String line = null;

while((line =buffer.readLine())!=null){

sb.append(line);

}

buffer.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return sb.toString();

}

/**

*

* @param urlStr

* @param path

* @param fileName

* @param rewrite 是否复写已存在的文件

* @return 整型:-1:代表下载文件出错,0:下载文件成功,1:代表文件已经存在

*/

public int downFile2SD (String urlStr,String path,String fileName,boolean rewrite){

InputStream inputStream = null;

try {

FileUtil fileUtils = new FileUtil();

if(fileUtils.isFileExist(path+fileName)&&!rewrite){

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 {

if(inputStream!=null)

inputStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return 0;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: