Android 下载文件及写入SD卡

时间:2021-09-11 15:34:02

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/downloadTxt"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="下载文本文件"
  12. />
  13. <Button
  14. android:id="@+id/downloadMp3"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:text="下载MP3文件"
  18. />
  19. </LinearLayout>
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.learning.example"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:name=".Download"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. </application>
  15. <uses-sdk android:minSdkVersion="8" />
  16. <!-- 访问网络和操作SD卡 加入的两个权限配置-->
  17. <uses-permission android:name="android.permission.INTERNET"/>
  18. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  19. </manifest>
  1. package com.learning.example.util;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.net.HttpURLConnection;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. public class HttpDownloader {
  11. private URL url = null;
  12. /**
  13. * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文本当中的内容
  14. * 1.创建一个URL对象
  15. * 2.通过URL对象,创建一个HttpURLConnection对象
  16. * 3.得到InputStream
  17. * 4.从InputStream当中读取数据
  18. * @param urlStr
  19. * @return
  20. */
  21. public String download(String urlStr){
  22. StringBuffer sb = new StringBuffer();
  23. String line = null;
  24. BufferedReader buffer = null;
  25. try {
  26. url = new URL(urlStr);
  27. HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
  28. buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
  29. while( (line = buffer.readLine()) != null){
  30. sb.append(line);
  31. }
  32. }
  33. catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. finally{
  37. try {
  38. buffer.close();
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. return sb.toString();
  44. }
  45. /**
  46. *
  47. * @param urlStr
  48. * @param path
  49. * @param fileName
  50. * @return
  51. *      -1:文件下载出错
  52. *       0:文件下载成功
  53. *       1:文件已经存在
  54. */
  55. public int downFile(String urlStr, String path, String fileName){
  56. InputStream inputStream = null;
  57. try {
  58. FileUtils fileUtils = new FileUtils();
  59. if(fileUtils.isFileExist(path + fileName)){
  60. return 1;
  61. } else {
  62. inputStream = getInputStreamFromURL(urlStr);
  63. File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
  64. if(resultFile == null){
  65. return -1;
  66. }
  67. }
  68. }
  69. catch (Exception e) {
  70. e.printStackTrace();
  71. return -1;
  72. }
  73. finally{
  74. try {
  75. inputStream.close();
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. return 0;
  81. }
  82. /**
  83. * 根据URL得到输入流
  84. * @param urlStr
  85. * @return
  86. */
  87. public InputStream getInputStreamFromURL(String urlStr) {
  88. HttpURLConnection urlConn = null;
  89. InputStream inputStream = null;
  90. try {
  91. url = new URL(urlStr);
  92. urlConn = (HttpURLConnection)url.openConnection();
  93. inputStream = urlConn.getInputStream();
  94. } catch (MalformedURLException e) {
  95. e.printStackTrace();
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. return inputStream;
  100. }
  101. }
  1. package com.learning.example.util;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import android.os.Environment;
  8. public class FileUtils {
  9. private String SDPATH;
  10. private int FILESIZE = 4 * 1024;
  11. public String getSDPATH(){
  12. return SDPATH;
  13. }
  14. public FileUtils(){
  15. //得到当前外部存储设备的目录( /SDCARD )
  16. SDPATH = Environment.getExternalStorageDirectory() + "/";
  17. }
  18. /**
  19. * 在SD卡上创建文件
  20. * @param fileName
  21. * @return
  22. * @throws IOException
  23. */
  24. public File createSDFile(String fileName) throws IOException{
  25. File file = new File(SDPATH + fileName);
  26. file.createNewFile();
  27. return file;
  28. }
  29. /**
  30. * 在SD卡上创建目录
  31. * @param dirName
  32. * @return
  33. */
  34. public File createSDDir(String dirName){
  35. File dir = new File(SDPATH + dirName);
  36. dir.mkdir();
  37. return dir;
  38. }
  39. /**
  40. * 判断SD卡上的文件夹是否存在
  41. * @param fileName
  42. * @return
  43. */
  44. public boolean isFileExist(String fileName){
  45. File file = new File(SDPATH + fileName);
  46. return file.exists();
  47. }
  48. /**
  49. * 将一个InputStream里面的数据写入到SD卡中
  50. * @param path
  51. * @param fileName
  52. * @param input
  53. * @return
  54. */
  55. public File write2SDFromInput(String path,String fileName,InputStream input){
  56. File file = null;
  57. OutputStream output = null;
  58. try {
  59. createSDDir(path);
  60. file = createSDFile(path + fileName);
  61. output = new FileOutputStream(file);
  62. byte[] buffer = new byte[FILESIZE];
  63. /*真机测试,这段可能有问题,请采用下面网友提供的
  64. while((input.read(buffer)) != -1){
  65. output.write(buffer);
  66. }
  67. */
  68. /* 网友提供 begin */
  69. int length;
  70. while((length=(input.read(buffer))) >0){
  71. output.write(buffer,0,length);
  72. }
  73. /* 网友提供 end */
  74. output.flush();
  75. }
  76. catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. finally{
  80. try {
  81. output.close();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. return file;
  87. }
  88. }
  1. package com.learning.example;
  2. import com.learning.example.util.HttpDownloader;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. public class Download extends Activity {
  9. private Button downlaodTxtButton ;
  10. private Button downlaodMP3Button ;
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. downlaodTxtButton = (Button)findViewById(R.id.downloadTxt);
  16. downlaodTxtButton.setOnClickListener(new DownloadTxtListener());
  17. downlaodMP3Button = (Button)findViewById(R.id.downloadMp3);
  18. downlaodMP3Button.setOnClickListener(new DownloadMP3Listener());
  19. }
  20. class DownloadTxtListener implements OnClickListener{
  21. @Override
  22. public void onClick(View v) {
  23. HttpDownloader downloader = new HttpDownloader();
  24. String lrc = downloader.download("http://172.16.11.9:8080/test/1.lrc");
  25. System.out.println(lrc);
  26. }
  27. }
  28. class DownloadMP3Listener implements OnClickListener{
  29. @Override
  30. public void onClick(View v) {
  31. HttpDownloader downloader = new HttpDownloader();
  32. int result = downloader.downFile("http://172.16.11.9:8080/test/1.mp3", "voa/", "1.map3");
  33. System.out.println(result);
  34. }
  35. }
  36. }

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

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