android 文件下载

2023-11-12

Download.java中放入的是程序的主体,util包中放入的是一些公用的方法,其中FileUtils.java放入的是对文件的一些基本操作,HttpDownloader.java中是对下载的一些基本操作。

 

第一步:先来看看主程序部分

package mars.download;

import mars.util.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Download extends Activity implements OnClickListener
{
	/** 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.main);
		findView();
	}

	public void findView()
	{
		downloadTxtButton = (Button) findViewById(R.id.downloadTxt);
		downloadTxtButton.setOnClickListener(this);

		downloadMp3Button = (Button) findViewById(R.id.downloadMp3);
		downloadMp3Button.setOnClickListener(this);
	}

	@Override
	public void onClick(View v)
	{
		// TODO Auto-generated method stub
		int viewId = v.getId();
		switch (viewId)
		{
		
		/**
		 * 这个方法只可以下载文本文件,它是逐行读取字符窜的。
		 */
		case R.id.downloadTxt:
		{
			HttpDownloader httpDownloader = new HttpDownloader();
			String lrc = httpDownloader.downStr("http://61.184.100.229/");//这个地方的url可以自己定义
			Log.e("@@@@", "downloadTxt: " + lrc);
		}
		
		/**
		 * 这个方法可以下载任何文件。
		 */
		case R.id.downloadMp3:
		{
			HttpDownloader httpDownloader = new HttpDownloader();
			int result = httpDownloader.downFile(
					"http://192.168.1.107:8080/voa1500/a1.mp3", "voa/",
					"a1.mp3");//这个地方的url同样可以自己定义
			Log.e("@@@@", "downloadMp3");
		}
		default:
			break;
		}
	}
}


 

第二步:看看对sdcard中文件的基本操作

package mars.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;

	public String getSDPATH()
	{
		return SDPATH;
	}

	public FileUtils()
	{
		//得到当前SDCARD存储设备的目录 /SDCARD, Environment.getExternalStorageDirectory()这个方法比较通用
		SDPATH = Environment.getExternalStorageDirectory() + "/";
	}

	/**
	 * 在SD卡上创建文件
	 */
	public File creatSDFile(String fileName) throws IOException
	{
		File file = new File(SDPATH + fileName);
		file.createNewFile();
		return file;
	}

	/**
	 * 在SD卡上创建目录
	 */
	public File creatSDDir(String dirName)
	{
		File dir = new File(SDPATH + dirName);
		dir.mkdir();
		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//InputStream里面的数据写入到SD卡中的固定方法
		{
			creatSDDir(path);
			file = creatSDFile(path + fileName);
			output = new FileOutputStream(file);
			byte buffer[] = new byte[4 * 1024];
			while ((input.read(buffer)) != -1)
			{
				output.write(buffer);
			}
			output.flush();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				output.close();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		return file;
	}
}


 

第三步:对下载的基本操作

package mars.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
{
	/**
	 * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
	 * 1.创建一个URL对象
	 * 2.通过URL对象,创建一个HttpURLConnection对象
	 * 3.得到InputStram
	 * 4.从InputStream当中读取数据
	 */
	private URL url = null;

	public String downStr(String urlStr)//下载字符流的方法
	{
		/**
		 * String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。
		 * String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。 
		 */
		StringBuffer sb = new StringBuffer();
		String line = null;
		BufferedReader buffer = null;//BufferedReader类用于从缓冲区中读取内容

		try
		{
			/**
			 * 因为直接使用InputStream不好用,多以嵌套了BufferedReader,这个是读取字符流的固定格式。
			 */
			
			url = new URL(urlStr);// 创建一个URL对象		
			HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// 创建一个Http连接
			buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));// 使用IO流读取数据
			
			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得到输入流
	 */
	public InputStream getInputStreamFromUrl(String urlStr)
			throws MalformedURLException, IOException
	{
		url = new URL(urlStr);// 创建一个URL对象	
		HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// 创建一个Http连接
		InputStream inputStream = urlConn.getInputStream();//得到输入流
		
		return inputStream;
	}
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 文件下载 的相关文章

  • 如何拦截全局资源加载?

    背景 我需要使用翻译 SDK Lokalise 文档here https docs lokalise com en articles 3487109 lokalise android sdk 2 0 beta 旨在从其服务器加载字符串资源
  • Android 中的短信编码

    我的问题是我想发送特定类别和特定编码的短信 0 类和 7 位编码 当检查 Android Telephony SmsManager 和 SmsMessage 时 您无能为力 SmsManager 提供两个功能 发送文本消息和发送数据消息 如
  • 删除 Android 中切换按钮的填充

    我正在 android 中创建一个简单的切换按钮并将背景设置为可绘制对象
  • 标记上存在语法错误,需要 AnnotationName - 查询错误

    我收到了令牌语法错误 AnnotationName 预期出现在以下行 query findInBackground new FindCallback
  • 未找到 Google 地图 api v2 类

    我正在使用谷歌地图 api v2 一切正常 今天早上我更新了 sdk 现在地图无法工作 尝试了很多事情 例如再次导入 lib 项目 但似乎没有任何效果 请帮忙 这是 logcat 输出 05 16 08 53 34 327 E dalvik
  • 如何在状态更改时更改 Android 切换按钮的文本颜色?

    我的切换按钮对于每个状态都有不同的颜色背景 红色和白色 现在我需要在激活时更改切换按钮文本 红色 白色 的颜色 使用 xml 我无法让它工作 也许有人知道我做错了什么 我的布局 xml 中的按钮
  • com.google.android:android:jar 的 dependency.dependency.version' 丢失

    我正在尝试使用 Eclipse 运行一个简单的虚拟 Android 项目 并且我正在尝试使用 Maven amd 我已按照已接受答案的教程进行操作this https stackoverflow com questions 6735562
  • 无法从视图转换为按钮

    我在这里遇到非常令人沮丧的问题 我有这个代码 Button b findViewById android R id button1 我收到了这个错误 类型不匹配 无法将表单视图转换为按钮 但是按钮1is一个按钮 在我的 XML 布局文档中
  • Android 上的嵌套滚动

    我们的活动中有一个主要的水平滚动视图 以及嵌套在其中的几个垂直滚动视图 这个想法是水平滚动 直到找到所需的垂直列表 然后上下滚动 理想情况下 一旦开始垂直滚动 我希望垂直滚动具有 锁定 现在会发生什么 如果您非常小心 您可以垂直滚动 但如果
  • 终端 (Mac) 上的 ndk-build 命令出错

    这是我在 bashrc 中的环境变量设置 export ANDROID SDK AndroidSDK android sdks export ANDROID NDK AndroidNDK android ndk r8d export PAT
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • 在 Android 的 Recycler View 中的文本视图背景上生成并设置随机颜色

    I am Trying to Generate Random Colors and set the Random color as background of Text View Just Like in GMail app The Tex
  • 如何在谷歌地图上显示闪烁的图标

    我想在谷歌地图上显示用户的当前位置 每件事对我来说都运转良好 我只是使用标记在地图上显示当前位置 现在我想让该标记像 Android 手机上的原始谷歌地图应用程序一样闪烁 我想我必须使用动画来达到这个目的 但我不知道如何使用它 我正在互联网
  • 如何在android中播放内部和外部SD卡中的mp3文件?

    我正在开发一个 mp3 播放器应用程序 它可以播放内部 SD 卡内任何位置的 mp3 文件 我使用以下代码来获取内部存储中存在的 mp3 文件 ArrayList
  • 过滤列表视图并获取正确的 onclick 项目

    我有一个列表视图 并且已经实现了过滤 假设我有项目 A B 和 C 如果我在过滤框中输入 B 则只会显示项目 B 它是列表的位置 0 之前位于位置 1 因此 当我调用 onClick 项目时 我得到 id position 0 这导致显示有
  • Textview 第一次点击时为空,但第二次点击时更新

    它是使用兼容性包的小型 Android 2 2 测试应用程序 我正在尝试更新列表项选择上另一个活动的另一个片段上的文本视图 但问题是 每次第一次单击都会返回空指针异常 并且只有在第二次尝试时 其文本才会更改 我想知道为什么会发生这种情况以及
  • Android HTTP PUT 请求

    谁能给我一个HTTP PUT请求 Android 的示例代码 假设您想使用 HttpURLConnection 要执行 HTTP PUT 请使用以下命令 URL url new URL http www example com resour
  • Android appwidget 远程视图未更新

    当我从某些活动更新小部件时 列表远程视图不会更新 我的意思是刷新自身 它会出现直到应用程序小部件的更新 日志显示 但不会进入列表视图的适配器以用新数据填充它 public void onUpdate Context context AppW
  • 应用程序启动器图标显示在活动的操作栏上

    在我的操作栏上显示应用程序图标 我不希望它出现在操作栏上 我修改了 androidmanifest xml 并删除了android icon从活动元素中 即使图标正在显示
  • 切换按钮形状不变

    我正在尝试制作一个带有绿色背景的圆形切换按钮 我用了

随机推荐

  • 微信公众号一些错误的原因错误代码41001

    微信公众号一些错误的原因错误代码41001 错误代码41001 缺少access token 碰到这种错误 请检查自己的appid和appsecret posted on 2017 05 08 18 02 baker95935 阅读 评论
  • git如何上传所有的新文件

    目的描述 新建的git项目 项目中有许多要从本地上传到git仓库的新文件 如果用git a filename的方法一个一个的添加 太费事费力 需要有命令添加所有改动 步骤 进入项目文件夹 在其中使用git bash 1 使用git clon
  • MySQL和MongoDB那些事

    什么是 MySQL 和 MongoDB MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统 MySQL 是一个关系数据库系统 以结构化表格格式存储数据 相比之下 MongoDB 以更灵活的格式将数据存储为 JSON
  • VC++ CSWDirectoryListCtrl磁盘文件列表

    效果图 头文件定义 CSWDirectoryListCtrl h pragma once include afxwin h include
  • leetcode 3. 最长不含重复的子字符串的五种解法

    leetcode链接 最长不含重复的子字符串 题目描述 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2
  • Android优化之启动优化和黑白屏优化

    文章目录 一 启动流程 1 开机启动流程 2 app启动流程 二 启动分类 三 黑白屏优化 1 写一个xml文件 activity welcome 2 welcomeActivity类 四 启动优化 1 获取启动时间 2 启动优化方向 一
  • Linux网络配置不生效

    关于解决Linux网络配置文件 修改不生效问题的解决方案 注意 外部问题 例如虚拟网卡 网段及网卡连通问题另行查找相关解决方案 本博客仅介绍比较生僻的Linux系统配置文件不生效有关问题 先看下产生的问题 修改为静态ip却不生效 我们按照正
  • 解决Echarts中双坐标轴分割错位问题

    1 处理函数 Description 刻度最大值 date 2023 08 30 param any isNaN maxValue 1 returns any export const getYAxisMax maxValue number
  • k8s yaml文件

    简介 YAML IPA j m l 尾音类似camel骆驼 是一个可读性高 用来表达资料序列的编程语言 YAML参考了其他多种语言 包括 XML C语言 Python Perl以及电子邮件格式RFC2822 Clark Evans在2001
  • C++基础之初始化、输入输出安全问题及常量问题

    一 C 统一初始化 初始化列表 解决方案 例1 int main int a 10 int b 10 int c 10 初始化列表 int arr 10 1 2 4 5 6 int brr 10 1 2 3 4 5 6 int crr 1
  • GAMES101回顾 -- Geometry

    Geometry Examples of geometry 隐式几何 Inplict 定义 用函数进行表示 如 f x y z 0 显式几何 Explict 定义 所有点都是直接或通过参数映射给出 所有的 u v 映射到对应的 x y z
  • 【毕业设计】爱琴海——基于HTML5的婚庆用品商城网页设计

    一 内容简介 一 背景与意义 婚俗 是指结婚的风俗 各国各族人民按照自己的习俗 举行各具特色的婚礼 具有各自浓厚的民族独特风采 婚俗元素在是中国婚俗文化的媒介 承载了中华儿女对幸福和吉祥的追求 在中国婚俗文化的发展过程中 婚庆用品设计一直在
  • 题目 2307: 蓝桥杯2019年第十届省赛真题-灵能传输

    题目 在游戏 星际争霸 II 中 高阶圣堂武士作为星灵的重要 AOE 单位 在 游戏的中后期发挥着重要的作用 其技能 灵能风暴 可以消耗大量的灵能对 一片区域内的敌军造成毁灭性的伤害 经常用于对抗人类的生化部队和虫族的 刺蛇飞龙等低血量单位
  • Android卡顿分析中常见的log

    1 看内存 bugreport 开始的时候有pss的信息 并且进行排序 之后会写一个解析和计算的 2 找system log中关键部分 一般设备hang 住的时候用户会疯狂按keycode 可以找相关log keyCode 3 down t
  • 工作与生活如何平衡?

    工作与生活如何平衡 最近忙的有些不像话了 完全没时间可以让自己慢下来思考一些事情 一方面 最近一直感觉自己身体不舒服 一方面 工作上的压力越来越大 要承担的东西也越来越多 生活 发现自己身体体质变差也有一段时间了 从一开始的小腿长时间有酸痛
  • PackageManagerService启动及初始化流程

    PackageManagerService也是有ServerThread启动的 运行在system process进程 我们先来看下PackageManagerService是怎么启动的 PackageManagerService的启动需要
  • 数据结构小白之稀疏数组

    说在前面 这部分笔记是边学习韩顺平老师的图解数据结构与算法边整理出来的 其中也加入了一些拙见 希望2019的暑假可以让自己的编程基础更加扎实 稀疏数组 概念 应用实例 代码 二维数组转稀疏数组 代码 稀疏数组转二维数组 概念 当一个数组中的
  • react 中引入 ant-design

    react 中引入 ant design 一 安装 二 引入 1 全局引入 2 按需加载 手动按需加载 使用 babel plugin import 按需加载 1 运行 npm run eject 暴露出webpack的配置文件 项目会多出
  • 做一个微信小程序的完整流程

    一 引言 最近在帮朋友开发一个小程序 都说今年是小程序快速发展的一年 不懂技术的人 大部分零售店面都开始想做一个小程序帮助推广销售 虽然小程序技术门槛没那么高 但自己独立做一个小程序还是需要了解的内容比较多的 帮朋友做的是一个电商小程序 下
  • android 文件下载

    Download java中放入的是程序的主体 util包中放入的是一些公用的方法 其中FileUtils java放入的是对文件的一些基本操作 HttpDownloader java中是对下载的一些基本操作 第一步 先来看看主程序部分 p