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


其实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;

}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值