android 文件下载 inputstream 为 null

最近做android应用,要做文件下载功能,于是就从网上找了一些代码。参照文档:http://zhoujingxian.iteye.com/blog/859597,代码如下

Android 下载文件及写入SD卡,实例代码

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
<Button    
    android:id="@+id/downloadTxt"  
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="下载文本文件"  
    />  
  
<Button    
    android:id="@+id/downloadMp3"  
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="下载MP3文件"  
    />  
</LinearLayout> 

Androidmanifest.xml代码

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="com.learning.example"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".Download"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
  
    </application>  
    <uses-sdk android:minSdkVersion="8" />  
  
<!-- 访问网络和操作SD卡 加入的两个权限配置-->  
<uses-permission android:name="android.permission.INTERNET"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
</manifest>   

下载助手类httpdownloader 代码

package com.learning.example.util;  
  
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.MalformedURLException;  
import java.net.URL;  
  
public class HttpDownloader {  
      
    private URL url = null;   
      
    /**  
     * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文本当中的内容  
     * 1.创建一个URL对象  
     * 2.通过URL对象,创建一个HttpURLConnection对象  
     * 3.得到InputStream  
     * 4.从InputStream当中读取数据  
     * @param urlStr  
     * @return  
     */  
    public String download(String urlStr){  
        StringBuffer sb = new StringBuffer();  
        String line = null;  
        BufferedReader buffer = null;  
        try {  
            url = new URL(urlStr);  
            HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();  
            buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));  
            while( (line = buffer.readLine()) != null){  
                sb.append(line);  
            }  
              
        }   
        catch (Exception e) {  
            e.printStackTrace();  
        }  
        finally{  
            try {  
                buffer.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return sb.toString();  
    }  
  
    /**  
     *   
     * @param urlStr  
     * @param path  
     * @param fileName  
     * @return   
     *      -1:文件下载出错  
     *       0:文件下载成功  
     *       1:文件已经存在  
     */  
    public int downFile(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 (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return 0;  
    }  
      
    /**  
     * 根据URL得到输入流  
     * @param urlStr  
     * @return  
     */  
    public InputStream getInputStreamFromURL(String urlStr) {  
        HttpURLConnection urlConn = null;  
        InputStream inputStream = null;  
        try {  
            url = new URL(urlStr);  
            urlConn = (HttpURLConnection)url.openConnection();  
            inputStream = urlConn.getInputStream();  
              
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
          
        return inputStream;  
    }  
}  

文件操作类fileutils 代码

package com.learning.example.util;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
  
import android.os.Environment;  
  
public class FileUtils {  
    private String SDPATH;  
      
    private int FILESIZE = 4 * 1024;   
      
    public String getSDPATH(){  
        return SDPATH;  
    }  
      
    public FileUtils(){  
        //得到当前外部存储设备的目录( /SDCARD )  
        SDPATH = Environment.getExternalStorageDirectory() + "/";  
    }  
      
    /**  
     * 在SD卡上创建文件  
     * @param fileName  
     * @return  
     * @throws IOException  
     */  
    public File createSDFile(String fileName) throws IOException{  
        File file = new File(SDPATH + fileName);  
        file.createNewFile();  
        return file;  
    }  
      
    /**  
     * 在SD卡上创建目录  
     * @param dirName  
     * @return  
     */  
    public File createSDDir(String dirName){  
        File dir = new File(SDPATH + dirName);  
        dir.mkdir();  
        return dir;  
    }  
      
    /**  
     * 判断SD卡上的文件夹是否存在  
     * @param fileName  
     * @return  
     */  
    public boolean isFileExist(String fileName){  
        File file = new File(SDPATH + 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;  
        try {  
            createSDDir(path);  
            file = createSDFile(path + fileName);  
            output = new FileOutputStream(file);  
                            byte[] buffer = new byte[FILESIZE];  
  
            /*真机测试,这段可能有问题,请采用下面网友提供的  
                            while((input.read(buffer)) != -1){  
                output.write(buffer);  
            }  
                            */  
  
                           /* 网友提供 begin */  
                           int length;  
                           while((length=(input.read(buffer))) >0){  
                                 output.write(buffer,0,length);  
                           }  
                           /* 网友提供 end */  
  
            output.flush();  
        }   
        catch (Exception e) {  
            e.printStackTrace();  
        }  
        finally{  
            try {  
                output.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return file;  
    }  
  
}  

主程序类download 代码

package com.learning.example;  
  
import com.learning.example.util.HttpDownloader;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
  
public class Download extends Activity {  
    private Button downlaodTxtButton ;  
    private Button downlaodMP3Button ;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        downlaodTxtButton = (Button)findViewById(R.id.downloadTxt);  
        downlaodTxtButton.setOnClickListener(new DownloadTxtListener());  
          
        downlaodMP3Button = (Button)findViewById(R.id.downloadMp3);  
        downlaodMP3Button.setOnClickListener(new DownloadMP3Listener());  
    }  
      
    class DownloadTxtListener implements OnClickListener{  
  
        @Override  
        public void onClick(View v) {  
            HttpDownloader downloader = new HttpDownloader();  
            String lrc = downloader.download("http://172.16.11.9:8080/test/1.lrc");  
            System.out.println(lrc);  
        }  
          
    }  
      
    class DownloadMP3Listener implements OnClickListener{  
  
        @Override  
        public void onClick(View v) {  
            HttpDownloader downloader = new HttpDownloader();  
            int result = downloader.downFile("http://172.16.11.9:8080/test/1.mp3", "voa/", "1.map3");  
            System.out.println(result);  
        }  
          
    }  
}  

Notice:访问网络和操作SD卡 记得加入的两个权限配置

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

按照以上的步骤做了之后,文件下载失败。通过debug追踪后发现获取的inputstream[inputStream = urlConn.getInputStream();]为null,这就有点搞不明白了,改代码放在java object中是没问题的,到了android object就歇菜了,搞得有点懵了。开始以为是xml中的权限没有起作用or配置错了,但是搞了一大圈配置是对的。然后只能请教android大虾了,一哥们说android4.0以上版本的文件下载必须是异步的,就是要和UI主线程分离开。然后试了一把,就,就可以了,好蛋疼。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值