Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
(1)文件的目录
(2)各文件的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/button1"
android:layout_marginRight="44dp"
android:layout_marginTop="78dp"
android:src="@drawable/ic_launcher" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/imageView1"
android:layout_marginLeft="96dp"
android:layout_marginTop="106dp"
android:text="Button" />
</RelativeLayout>
package com.example.data_storage_sdcard.file;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.os.Environment;
/**
* sdcard的存在于上下文无关
*
* @author piaodangdehun
*
*/
public class FileService {
/*
* 存放在sdcard的根目录
*/
public boolean saveFileToSdcardRoot(String fileName, byte[] data) {
boolean flag = false;
/*
* 先判断sdcard的状态,是否存在
*/
String state = Environment.getExternalStorageState();
FileOutputStream outputStream = null;
File rootFile = Environment.getExternalStorageDirectory(); // 获得sdcard的根路径
/*
* 表示sdcard挂载在手机上,并且可以读写
*/
if (state.equals(Environment.MEDIA_MOUNTED)) {
File file = new File(rootFile, fileName);
try {
outputStream = new FileOutputStream(file);
try {
outputStream.write(data, 0, data.length);
flag = true;
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return flag;
}
/*
* 存放在sdcard下自定义的目录
*/
public boolean saveFileToSdcardDir(String fileName, byte[] data) {
boolean flag = false;
/*
* 先判断sdcard的状态,是否存在
*/
String state = Environment.getExternalStorageState();
FileOutputStream outputStream = null;
File rootFile = Environment.getExternalStorageDirectory(); // 获得sdcard的根路径
/*
* 表示sdcard挂载在手机上,并且可以读写
*/
if (state.equals(Environment.MEDIA_MOUNTED)) {
File file = new File(rootFile.getAbsoluteFile() + "/txt");
if (!file.exists()) {
file.mkdirs();
}
try {
outputStream = new FileOutputStream(new File(file, fileName));
try {
outputStream.write(data, 0, data.length);
flag = true;
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return flag;
}
/*
* 用于读取sdcard的数据
*/
public String readContextFromSdcard(String fileName) {
String state = Environment.getExternalStorageState();
File rooFile = Environment.getExternalStorageDirectory(); // 获得sdcard的目录
FileInputStream inputStream = null;// 用于度取数据的流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 用于存放独处的数据
if (state.equals(Environment.MEDIA_MOUNTED)) {
File file = new File(rooFile.getAbsoluteFile() + "/txt/");// 在sdcard目录下创建一个txt目录
File file2 = new File(file, fileName);
int len = 0;
byte[] data = new byte[1024];
if (file2.exists()) {
try {
inputStream = new FileInputStream(file2);
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, data.length);
}
} catch (IOException e) {
e.printStackTrace();
}
return new String(outputStream.toByteArray());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return null;
}
/**
* 对文件进行分类的保存到固定的文件中去
*
* @param fileName
* @param data
*/
public void saveFileToSdcardBySuff(String fileName, byte[] data) {
// File file = Environment.getExternalStoragePublicDirectory("");
// 保存文件的目录
File file = null;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
/*
* 将不同的文件放入到不同的类别中
*/
if (fileName.endsWith(".mp3")) {
file = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
} else if (fileName.endsWith(".jpg") || fileName.endsWith(".png")
|| fileName.endsWith(".gif")) {
file = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
} else if (fileName.endsWith(".mp4") || fileName.endsWith(".avi")
|| fileName.endsWith(".3gp")) {
file = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
} else {
file = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
}
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(new File(file, fileName));
try {
outputStream.write(data, 0, data.length);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/*
* 删除一个文件
*/
public boolean deleteFileFromSdcard(String folder, String fileName) {
boolean flag = false;
File file = Environment.getExternalStorageDirectory();
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File exitFile = new File(file.getAbsoluteFile() + "/" + folder);
if (exitFile.exists()) {
exitFile.delete();
}
}
return flag;
}
}
HttpUtils.java访问网络的
package com.example.data_storage_sdcard.http;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class HttpUtils {
/*
*
*/
public static byte[] getImage(String path) {
byte[] data = null;
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(path);
try {
HttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
data = EntityUtils.toByteArray(response.getEntity());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return data;
}
}
ImageCache.java将文件放到cache中的:
package com.example.data_storage_sdcard.img;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.os.Environment;
public class ImageCache {
public static String saveImageCache(String fileName, byte[] data) {
File file = Environment.getExternalStorageDirectory(); // 根目录
FileOutputStream outputStream = null;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
try {
outputStream = new FileOutputStream(new File(file, fileName));
outputStream.write(data, 0, data.length);
return file.getAbsolutePath() + "/" + fileName;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return null;
}
}
MainActivity.java
package com.example.data_storage_sdcard;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import com.example.data_storage_sdcard.http.HttpUtils;
import com.example.data_storage_sdcard.img.ImageCache;
public class MainActivity extends Activity {
private Button button;
private ImageView imageView;
private ProgressDialog progressDialog;
private String imageName;
private final String pathString = "http://www.baidu.com/img/bd_logo1.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
imageView = (ImageView) this.findViewById(R.id.imageView1);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("下载提示");
progressDialog.setMessage("load...");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute(pathString);
}
});
}
class MyTask extends AsyncTask<String, Void, byte[]> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected byte[] doInBackground(String... params) {
String name = params[0];
imageName = name
.substring(name.lastIndexOf("/") + 1, name.length());
return HttpUtils.getImage(params[0]);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(byte[] result) {
super.onPostExecute(result);
if (result != null) {
Bitmap bm = BitmapFactory.decodeByteArray(result, 0,
result.length);
imageView.setImageBitmap(bm);
ImageCache.saveImageCache("", result);
} else {
imageView.setImageResource(R.drawable.ic_launcher);
}
progressDialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
测试类:
package com.example.data_storage_sdcard;
import java.io.FileWriter;
import com.example.data_storage_sdcard.file.FileService;
import android.nfc.Tag;
import android.test.AndroidTestCase;
import android.util.Log;
public class MyTest extends AndroidTestCase {
public void saveFileToSdcardTest() {
FileService fileService = new FileService();
fileService.saveFileToSdcardRoot("aa.txt",
"jkhdsfjkhdskjfhdsjf".getBytes());
}
public void saveFileToSdcardDir() {
FileService fileService = new FileService();
fileService.saveFileToSdcardRoot("aa.txt",
"jkhdsfjkhdskjfhdsjf".getBytes());
}
public void readContextFromSdcardTest() {
FileService fileService = new FileService();
String msg = fileService.readContextFromSdcard("aa.txt");
System.err.println("-->" + msg);
}
public void saveFileToSdcardBySuffTest() {
FileService fileService = new FileService();
fileService.saveFileToSdcardBySuff("aa.avi",
"asdfkajsgdhagsdfhdgsf".getBytes());
}
public void delFile() {
FileService fileService = new FileService();
boolean flag = fileService.deleteFileFromSdcard("txt", "aa.txt");
}
}
需要在请单位按中加入访问网络的权限、操作sdcard的权限、测试的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.data_storage_sdcard"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.data_storage_sdcard" >
</instrumentation>
<!-- 添加访问sdcard的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 添加访问网络的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name="com.example.data_storage_sdcard.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>
<uses-library>
</uses-library>
</application>
</manifest>