Android学习笔记——download

1.该工程的功能是实现从网上的链接下载一个lrc文件和一个mp3文件

以下代码是MainActivity.java中的代码

package com.example.download;


import com.example.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 MainActivity extends Activity {
    /** Called when the activity is first created. */
    private Button downloadTxtButton;
    private Button downloadMp3Button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        downloadTxtButton = (Button)findViewById(R.id.downloadTxt);
        downloadTxtButton.setOnClickListener(new DownloadTxtListener());
        downloadMp3Button = (Button)findViewById(R.id.downloadMp3);
        downloadMp3Button.setOnClickListener(new DownloadMp3Listener());
    }
    
    class DownloadTxtListener implements OnClickListener{
        public void onClick(View v) {
        HttpDownloader httpDownloader = new HttpDownloader();
        int lrc = httpDownloader.downFile("http://play.baidu.com/data2/lrc/121017633/121017633.lrc", "voa/", "1201250291414036861128.lrc");
        System.out.println(lrc);
        } 
    }
    
    class DownloadMp3Listener implements OnClickListener{
        public void onClick(View v) {
        // TODO Auto-generated method stub
        HttpDownloader httpDownloader = new HttpDownloader();
        int result = httpDownloader.downFile("http://cdn.y.baidu.com/yinyueren/532bfdb43a336a584533ff61a7289503.mp3", "voa/", "江南.mp3");
        System.out.println(result);
        }
    }
    
}

 

以下代码是FileUtils.java中的代码

package com.example.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;
    public String getSDPATH() {
    return SDPATH;
    }
    
    public FileUtils() {
     //得到当前外部存储设备的目录
     // /SDCARD
     SDPATH = Environment.getExternalStorageDirectory() + "/";
    }
    
    /**
     * 在SD卡上创建文件
     * 
     * @throws IOException
     */
    public File creatSDFile(String fileName) throws IOException {
        File file = new File(SDPATH + fileName);
        file.createNewFile();
        return file;
    }
 
    /**
     * 在SD卡上创建目录
     * 
     * @param dirName
     */
    public File creatSDDir(String dirName) {
        File dir = new File(SDPATH + dirName);
        dir.mkdirs();
        return dir;
    }
    
    /**
     * 判断SD卡上的文件夹是否存在
     */
    public boolean isFileExist(String fileName){
        File file = new File(SDPATH + fileName);
        return file.exists();
    }
 
    /**
     * 将一个InputStream里面的数据写入到SD卡中
     */
    public File write2SDFromInput(String path,String fileName,InputStream input){
        File file = null;
        OutputStream output = null;
        try{
            creatSDDir(path);
            file = creatSDFile(path + fileName);
            output = new FileOutputStream(file);
            byte buffer [] = new byte[4 * 1024];
            int len=-1;
            while((len=input.read(buffer)) != -1){
                //在这里使用另一个重载,防止流写入的问题.
                output.write(buffer,0,len);
            }
            output.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
                try{
                    output.close();
                }    
                catch(Exception e){
                    e.printStackTrace();
                }
        }
        return file;
    }
}

 

以下代码是HttpDownloader.java中的代码

package com.example.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.得到InputStram
     * 4.从InputStream当中读取数据
     * @param urlStr
     * @return
     */
    
    public String download(String urlStr) {
        StringBuffer sb = new StringBuffer();
        String line = null;
        BufferedReader buffer = null;
        try {
            // 创建一个URL对象
            url = new URL(urlStr);
            // 创建一个Http连接
            HttpURLConnection urlConn = (HttpURLConnection) url
                    .openConnection();
            // 使用IO流读取数据
            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 (Exception e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
 
    /**
     * 该函数返回整形 -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 (Exception e) {
                e.printStackTrace();
            }
        }
        return 0;
    }
 
    /**
     * 根据URL得到输入流
     * 
     * @param urlStr
     * @return
     * @throws MalformedURLException
     * @throws IOException
     */
    public InputStream getInputStreamFromUrl(String urlStr)
        throws MalformedURLException, IOException {
        url = new URL(urlStr);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        InputStream inputStream = urlConn.getInputStream();
        return inputStream;
    }
}

 

以下代码是activity_main.xml中的代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <Button
        android:id="@+id/downloadTxt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="downloadTxt"
        />
    
    <Button
        android:id="@+id/downloadMp3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="downloadMp3"
        />

</LinearLayout>

 

以下代码是AndroidManifest.xml中的代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.download"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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>

 

2.该工程实现下载一个xml文件,并解析

转自http://blog.csdn.net/sam_zhang1984

      XML 解析主要需要进行下列步骤:

      1.        创建事件处理程序

      2.        创建 SAX 解析器

      3.        将事件处理程序分配给解析器

      4.        对文档进行解析,将每个事件发送给处理程序。

 

以下的代码是MainActivity.java中的代码

package com.example.xml;

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

import com.example.utils.HttpDownloader;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    private Button parseButton ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parseButton = (Button)findViewById(R.id.parseButton);
        parseButton.setOnClickListener(new ParseButtonListener());
    }
    
    class ParseButtonListener implements OnClickListener{

        public void onClick(View v) {
            HttpDownloader hd = new HttpDownloader();
            String resultStr = hd.download("http://192.168.1.107:8081/voa1500/test.xml");
            System.out.println(resultStr);
            try{
                //创建一个SAXParserFactory
                SAXParserFactory factory = SAXParserFactory.newInstance();
                XMLReader reader = factory.newSAXParser().getXMLReader();
                //为XMLReader设置内容处理器
                reader.setContentHandler(new MyContentHandler());
                //开始解析文件
                reader.parse(new InputSource(new StringReader(resultStr)));
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }
}

 

以下的代码是MyContentHandler.java中的代码

package com.example.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler {
    String hisname, address, money, sex, status;
    String tagName;

    public void startDocument() throws SAXException {
        System.out.println("````````begin````````");
    }

    public void endDocument() throws SAXException {
        System.out.println("````````end````````");
    }

    public void startElement(String namespaceURI, String localName,
            String qName, Attributes attr) throws SAXException {
        tagName = localName;
        if (localName.equals("worker")) {
            //获取标签的全部属性
            for (int i = 0; i < attr.getLength(); i++) {
                System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i));
            }
        }
    }

    public void endElement(String namespaceURI, String localName, String qName)
            throws SAXException {
        //在workr标签解析完之后,会打印出所有得到的数据
        tagName = "";
        if (localName.equals("worker")) {
            this.printout();
        }
    }
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (tagName.equals("name"))
            hisname = new String(ch, start, length);
        else if (tagName.equals("sex"))
            sex = new String(ch, start, length);
        else if (tagName.equals("status"))
            status = new String(ch, start, length);
        else if (tagName.equals("address"))
            address = new String(ch, start, length);
        else if (tagName.equals("money"))
            money = new String(ch, start, length);
    }

    private void printout() {
        System.out.print("name: ");
        System.out.println(hisname);
        System.out.print("sex: ");
        System.out.println(sex);
        System.out.print("status: ");
        System.out.println(status);
        System.out.print("address: ");
        System.out.println(address);
        System.out.print("money: ");
        System.out.println(money);
        System.out.println();
    }

}

 

以下的代码是FileUtils.java中的代码

package com.example.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;
    public String getSDPATH() {
    return SDPATH;
    }
    
    public FileUtils() {
     //得到当前外部存储设备的目录
     // /SDCARD
     SDPATH = Environment.getExternalStorageDirectory() + "/";
    }
    
    /**
     * 在SD卡上创建文件
     * 
     * @throws IOException
     */
    public File creatSDFile(String fileName) throws IOException {
        File file = new File(SDPATH + fileName);
        file.createNewFile();
        return file;
    }
 
    /**
     * 在SD卡上创建目录
     * 
     * @param dirName
     */
    public File creatSDDir(String dirName) {
        File dir = new File(SDPATH + dirName);
        dir.mkdirs();
        return dir;
    }
    
    /**
     * 判断SD卡上的文件夹是否存在
     */
    public boolean isFileExist(String fileName){
        File file = new File(SDPATH + fileName);
        return file.exists();
    }
 
    /**
     * 将一个InputStream里面的数据写入到SD卡中
     */
    public File write2SDFromInput(String path,String fileName,InputStream input){
        File file = null;
        OutputStream output = null;
        try{
            creatSDDir(path);
            file = creatSDFile(path + fileName);
            output = new FileOutputStream(file);
            byte buffer [] = new byte[4 * 1024];
            int len=-1;
            while((len=input.read(buffer)) != -1){
                //在这里使用另一个重载,防止流写入的问题.
                output.write(buffer,0,len);
            }
            output.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
                try{
                    output.close();
                }    
                catch(Exception e){
                    e.printStackTrace();
                }
        }
        return file;
    }
}

 

以下的代码是HttpDownloader.java中的代码

package com.example.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.得到InputStram
     * 4.从InputStream当中读取数据
     * @param urlStr
     * @return
     */
    
    public String download(String urlStr) {
        StringBuffer sb = new StringBuffer();
        String line = null;
        BufferedReader buffer = null;
        try {
            // 创建一个URL对象
            url = new URL(urlStr);
            // 创建一个Http连接
            HttpURLConnection urlConn = (HttpURLConnection) url
                    .openConnection();
            // 使用IO流读取数据
            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 (Exception e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
 
    /**
     * 该函数返回整形 -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 (Exception e) {
                e.printStackTrace();
            }
        }
        return 0;
    }
 
    /**
     * 根据URL得到输入流
     * 
     * @param urlStr
     * @return
     * @throws MalformedURLException
     * @throws IOException
     */
    public InputStream getInputStreamFromUrl(String urlStr)
        throws MalformedURLException, IOException {
        url = new URL(urlStr);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        InputStream inputStream = urlConn.getInputStream();
        return inputStream;
    }
}

 

以下的代码是activity_main.xml中的代码

<?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"
    >
    
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
         android:id="@+id/parseButton"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="开始解析XML"/>
</LinearLayout>

 

posted @ 2015-06-16 22:15  tonglin0325  阅读(320)  评论(0编辑  收藏  举报