java 访问手机存储卡,android实现文件下载并存储进SD卡
标题很明显,这篇博文主要内容是:
在android程序中实现文件的下载并存储进手机或虚拟机的SD卡
在demo中我主要操作为:
1,根据有效的文本文件url地址,读取文本内容;demo使用的是.lrc格式的文件。
2,根据有效的文本文件url地址,把文件从网络地址下载,并放在手机SD卡中;demo使用的是.mp3文件。
很明显可以看出来两个demo用的文件是我们经常用到的,即是存储歌词和歌曲的两个文件,使用性强。
好了下面直接看过程,首先新建一个安卓项目,我这里定义为类DownloadActivity,很明显是一个下载demo,
大家看一下我项目的目录结构:
我用的版本是4.0的,图中画红色框的是需要编写代码的文件!下面给出文件的具体代码:
-------------------------------------- DownloadActivity.java
-----------------------------------
package com.senly.download;
import com.senly.utils.HttpDownloader;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class DownloadActivity extends Activity {
private Button downloadLRC = null;
private Button downloadMP3 = null;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
downloadLRC =
(Button)findViewById(R.id.downloadLRC);
downloadMP3 =
(Button)findViewById(R.id.downloadMP3);
downloadLRC.setOnClickListener(new
DownloadLRCListener());
downloadMP3.setOnClickListener(new
DownloadMP3Listener());
}
class DownloadLRCListener implements
OnClickListener{
@Override
public void onClick(View v)
{
new
MyThread(1).start();
}
}
class DownloadMP3Listener implements
OnClickListener{
@Override
public void onClick(View v)
{
new
MyThread(2).start();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_download,
menu);
return true;
}
class MyThread extends Thread{
private int flag = 0 ;
public MyThread(){}
public MyThread(int
flag){
this.flag =
flag;
}
@Override
public void run() {
if ( 1 ==
flag ) { // 基本文件下载
HttpDownloader
httpDownloader = new HttpDownloader();
String
contents = httpDownloader.downloadBaseFile("http://192.168.1.104:8081/CFM_xfire/I_Remember.lrc");
System.out.println(contents);
}
if ( 2 ==
flag ){ // 复杂文件下载及存储到手机SD卡
HttpDownloader
httpDownloader = new HttpDownloader();
int
resultInt = httpDownloader.downloadAllFile("http://192.168.1.104:8081/CFM_xfire/I_Remember.mp3","/downloadDir","/i_remember.mp3");
System.out.println(resultInt);
}
}
}
}
------------------------------------------ FileUtils.java
-----------------------------------
package com.senly.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;
import android.util.Log;
public class FileUtils {
private String SD_PATH;
public String getSD_PATH() {
return SD_PATH;
}
public FileUtils (){
//得到当前外部存储设备的目录
SD_PATH =
Environment.getExternalStorageDirectory() + "/";
}
public File createSDFile(String fileName) throws
IOException{
File file =
new File(SD_PATH + fileName);
file.createNewFile();
return file;
}
public File createSDDir(String dirName){
File dir = new File(SD_PATH +
dirName);
dir.mkdir();
return dir;
}
public boolean isFileExist(String
fileName){
File file = new File(SD_PATH +
fileName);
return file.exists();
}
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[4 * 1024];
while(input.read(buffer)
!= -1){
output.write(buffer);
}
//清掉缓存
output.flush(); } catch (Exception e) {
Log.e("write2SDFromInput",
e.getMessage());
} finally {
try {
if
(output != null){
output.close();
}
} catch
(IOException ioe){
Log.e("write2SDFromInput",
ioe.getMessage());
}
}
return file;
}
}
------------------------------------------
HttpDownloader.java -----------------------------------
package com.senly.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;
public String downloadBaseFile(String
urlStr){
StringBuffer sb = new
StringBuffer();
String line = null;
BufferedReader reader =
null;
try{
//创建一个url对象
url = new
URL(urlStr);
//通過url对象,创建一个HttpURLConnection对象(连接)
HttpURLConnection
urlConnection = (HttpURLConnection)url.openConnection();
//通过HttpURLConnection对象,得到InputStream
reader = new
BufferedReader(new
InputStreamReader(urlConnection.getInputStream()));
//使用io流读取文件
while ((line
= reader.readLine()) != null){
sb.append(line);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if
(reader != null){
reader.close();
}
} catch
(Exception e){
e.printStackTrace();
}
}
return sb.toString();
}
public int downloadAllFile(String urlStr,String
path, String fileName){
InputStream inputStream =
null;
try {
FileUtils
fileUtils = new FileUtils();
if
(fileUtils.isFileExist(path + fileName)){
return
1;
} else
{
inputStream
= getInputStream(urlStr);
File
file = fileUtils.write2SDFromInput(path, fileName,
inputStream);
if
( file == null ){
return
-1;
}
}
} catch (Exception e) {
e.printStackTrace();
return
-1;
} finally {
try {
if
(inputStream != null){
inputStream.close();
}
}catch
(Exception ioe){
ioe.printStackTrace();
}
}
return 0;
}
private InputStream getInputStream(String
urlStr)
throws
MalformedURLException,IOException {
url = new URL(urlStr);
HttpURLConnection
httpURLConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream =
httpURLConnection.getInputStream();
return inputStream;
} }
------------------------------ layout / activity_download.xml
---------------------------------
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DownloadActivity" >
android:id="@+id/myTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/myTextView" />
android:id="@+id/downloadLRC"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/myTextView"
android:layout_marginTop="10dp"
android:text="@string/downloadLRC" />
android:id="@+id/downloadMP3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/downloadLRC"
android:layout_marginTop="10dp"
android:text="@string/downloadMP3" />
-------------------------------------- values / strings.xml
-----------------------------------
encoding="utf-8"?>
name="app_name">Download
Hello
world!
name="menu_settings">Settings
name="myTextView">下载文件
name="downloadLRC">downloadLRC
name="downloadMP3">downloadMP3
----------------------------------------
AndroidManifest.xml -----------------------------------
encoding="utf-8"?>
package="com.senly.download"
android:versionCode="1"
android:versionName="1.0" >
android:minSdkVersion="8"
android:targetSdkVersion="14" />
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:name="android.permission.INTERNET"
>
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name="com.senly.download.DownloadActivity"
android:label="@string/app_name" >
/>
android:name="android.intent.category.LAUNCHER"
/>
好的,到这里项目就算开发完了,不过你肯定有疑问,这下面两个url找不到啊!
没错,你肯定找不到,假如你只是想了解文件下载的实现,那么你直接到网络上找到两个文件地址代替就行了
可以跟我一样使用 .lrc 和 .mp3
文件,当然可以是其他文件,但是要注意“文件下载类HttpDownloader”中两个方法的执行范围:
1,对于 downloadBaseFile(String urlStr)
方法,是根据URL下载文件地址,前提是这个文件中的内容是文本类型。
2,对于 downloadAllFile(String urlStr,String path, String fileName)
方法, 是根据URL下载文件地址并把文件写入到SD卡,支持几乎大部分文件类型。
到这里,文章的大概目的就已经达到了!
(假如还没成功请往下看!)
结果是:
点击 downloadLRC 按钮,下载歌词文件,并打印出来!(会出现乱码,这是logcat的问题)
点击 downloadMP3 按钮 , 会打印 0 成功 ,1 已经存在 (我操作两次,所以显示1)
但是,假如在网上找不到这些文件的那该这么实验呢,我是如何把本地作为服务器的呢,很简单,接着看。
首先,使用 tomcat
,这个对于java开发人员来说,是熟悉得不过了的,非常有亲切感是吧!(当然你可以使用其他服务器)
找到tomcat安装目录下的conf文件夹中的server.xml文件,在中写上如下语句,部署项目如下:
path="/CFM_xfire">
ps:
1,docBase="E:\mywork\CFM_xfire"
指明项目路径
2,path="/CFM_xfire" 指明在浏览器上访问的地址
其中 CFM_xfire 是我的项目(随便新建一个java
web项目就行了),主要目的是存放 .lrc
和 .mp3 文件,目录如下(注意路径)
在tomcat上部署好之后,启动tomcat,在浏览器地址栏上可以尝试访问这两个地址(你是访问不了的,因为192.168.1.104是我联网的ip地址):
当然你访问这两个地址才是正确的,可能会更亲切:
或者
第一个会显示歌词信息,第二个会提示下载!
那为什么我在程序中会使用 192.168.1.104 因为安卓访问 127.0.0.1 和 localhost 会报错,因为它希望访问ip协议中的url地址!这一点请记住!庆幸的是,你假如看得了这篇文章,那么证明你正在上网,那么就换成你的ip就行了!
大家要是遇到什么解决不了的问题,请提出来一起解决!
如何查看文件是否已经下载在手机SD中,请看我另一篇文章!
java 访问手机存储卡,android实现文件下载并存储进SD卡相关推荐
- java 访问手机存储卡,Android App将数据写入内部存储和外部存储的示例
File存储(内部存储) 一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密. Context提供了2个方法来打开输入.输出流 FileInputStream openFil ...
- Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)
本次实例以文本和图片为例,展示了Android手机内部存储的读写方法.SD卡的读写方法,包内文件的读取,以及网络文本及图片的加载与下载. 项目文件在此:文档下载传送门 从网络加载图片或 ...
- 存储卡已满 Android,【图片】存储到sd卡提示存储已满有办法解决么【android吧】_百度贴吧...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一.游戏能引发贪心.玩游戏的人本身就发心不善,好逸恶劳,贪乐忘本,而游戏产生的功利心.好胜心.乐心,都是贪求心,贪求虚妄的愉悦,长期受此熏陶,必然在现实中 ...
- android 访问存储卡,Android:无法访问存储在SD卡中的文件
我正在研究一个读取存储在SD卡(内部/数据/本地)中的.txt文件的应用程序.我遇到的问题是,它似乎可以访问文件路径,但它不能访问文件本身(尽管它具有读取和写入权限),但会引发FileNotFound ...
- Android—将Bitmap图片保存到SD卡目录下或者指定目录
直接上代码就不废话啦 一:保存到SD卡下 [java] view plain copy File file = new File(Environment.getExternalStorageDirec ...
- Android 制定安装重写迁移至SD卡 APP2SD
/********************************************************** 大家都知道写博客会很累的,希望 转载请注明出处:http://blog.csdn ...
- android 使用SAF框架操作外置sd卡
android 使用SAF框架操作外置sd卡 在 Android 4.4中,Google 对 SD卡 的访问已经做了严格的限制,在 Android 5.0中,开发者可以使用 新API 要求用户对某个指 ...
- Android的.apk软件安装到sd卡的方法
对于Android 2.2开始的软件可以装到到SD上的支持,对于adb命令而言也有了改进,对于Android 2.2固件中的pm命令开支持安装选项参数,这里新增了参数setInstallLocatio ...
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/327.html 很多童鞋说 ...
最新文章
- 【配置文件】log4j是什么log4j
- Xshell 连接报错解决:WARNING! The remote SSH server rejected X11 forwarding request.
- 计算机操作系统课后题答案第三章,计算机操作系统教程习题与实验指导(第3版)...
- 2019年4月第四周_2012年4月最佳怪胎文章
- 程序员常用网站收藏[定期更新]——csdn博客
- 空调调节 java_空调调节方式
- 并发编程中的重重量级模型和轻量级模型
- excel数据库_EXCEL憋出大招,逆袭大数据的黑马出现了
- Struts,Spring,Hibernate面试题总结
- Ubuntu下反编译apk源码查看
- 山西大同大学计算机考试打印准考证
- ie无法下载 无法打开该internet站点.请求的站点不可用或无法找到.请稍后重试
- 蓝牙的文件传输服务器,文件传输速度大比拼:Wi-Fi完爆蓝牙
- 微信小程序:上传的图片显示旋转问题
- 基于django channel 实现websocket的聊天室
- 基于单片机的坐姿提醒系统设计(#0475)
- python设计模式名片_Python设计模式之门面模式简单示例
- 下载 tumblr 标记为喜欢的内容
- cisco SCE 第一部分 介绍
- 曾仕强--情绪管理学习笔记--中国人最需要情绪管理
热门文章
- python3.7安装, 解决pip is configured with locations that require TLS/SSL问题
- Class中Query Filter
- 软工实践(二)——构建之法读后感
- 常见网站CSS样式重置
- 通过SQL发送邮件,SQL发送Email(转)
- Windows安装PostgreSQL11.1
- Bootstrap系列 -- 36. 向上弹起的下拉菜单
- (转) RabbitMQ学习之发布/订阅(java)
- JAVA设计模式初探之桥接模式
- The content of element type configuration must match (properties?,settings?,typeAliases?,typeHand...