读书人

在学习下载文件的时候出现有关问题了

发布时间: 2012-04-17 15:06:33 作者: rapoo

在学习下载文件的时候出现问题了
main.xml

XML code
<?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="@string/txt"    /><Button      android:id="@+id/downloadMp3"    android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/mp3"    /></LinearLayout>


AndroidManifest.xml
XML code
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.chk.download"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="15" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".DownloadActivity"            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>    <!-- 获得网络权限和SD卡的读写权限 -->    <uses-permission android:name="android.permission.INTERNET"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></manifest>


HttpDownloader.java
Java code
package com.chk.utils;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.java
Java code
package com.chk.utils;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);            }            output.flush();        }         catch (Exception e) {            e.printStackTrace();        }        finally{            try {                output.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return file;    }}


DownloadActivity.java
Java code
package com.chk.download;import com.chk.utils.HttpDownloader;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class DownloadActivity 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{        public void onClick(View v) {            HttpDownloader downloader = new HttpDownloader();            String lrc = downloader.download("http://localhost:8080/MyTxt/test.txt");            System.out.println(lrc);        }            }        class DownloadMP3Listener implements OnClickListener{        public void onClick(View v) {            HttpDownloader downloader = new HttpDownloader();            int result = downloader.downFile("http://localhost:8080/MyTxt/1.mp3", "MP3/", "1.map3");            System.out.println(result);        }            }}


我的Tomcat已经正常启动,Tomcat中定义的路径是<Context path="" docBase="D:\MyWeb"></Context>,所以我在D:\MyWeb目录下新建了MyTxt目录,在MyTxt目录下有两个文件:test.txt和1.mp3,当我部署后,点击下载文本文件这个按钮的时候,出现的错误提示如下:


XML code
02-21 22:26:46.359: E/AndroidRuntime(1038): FATAL EXCEPTION: main02-21 22:26:46.359: E/AndroidRuntime(1038): java.lang.NullPointerException02-21 22:26:46.359: E/AndroidRuntime(1038):     at com.chk.utils.HttpDownloader.download(HttpDownloader.java:43)02-21 22:26:46.359: E/AndroidRuntime(1038):     at com.chk.download.DownloadActivity$DownloadTxtListener.onClick(DownloadActivity.java:30)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.view.View.performClick(View.java:3511)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.view.View$PerformClick.run(View.java:14105)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.os.Handler.handleCallback(Handler.java:605)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.os.Handler.dispatchMessage(Handler.java:92)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.os.Looper.loop(Looper.java:137)02-21 22:26:46.359: E/AndroidRuntime(1038):     at android.app.ActivityThread.main(ActivityThread.java:4424)02-21 22:26:46.359: E/AndroidRuntime(1038):     at java.lang.reflect.Method.invokeNative(Native Method)02-21 22:26:46.359: E/AndroidRuntime(1038):     at java.lang.reflect.Method.invoke(Method.java:511)02-21 22:26:46.359: E/AndroidRuntime(1038):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)02-21 22:26:46.359: E/AndroidRuntime(1038):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)02-21 22:26:46.359: E/AndroidRuntime(1038):     at dalvik.system.NativeStart.main(Native Method)


请各位帮帮忙!到底是哪里出了问题
我是在虚拟机上运行的,因为没有实体机
错误提示如下两行代码出错!
Java code
buffer.close();

Java code
String lrc = downloader.download("http://localhost:8080/MyTxt/test.txt");


[解决办法]
ip改成10.0.0.2,一定可以,这会android虚拟机映射的本机电脑的ip
[解决办法]
是在HttpDownloader.java这个文件!



String lrc = downloader.download("http://localhost:8080/MyTxt/test.txt");这里也要改:把localhost改成你的IP地址!

读书人网 >Android

热点推荐