Android学习笔记之数据的Sdcard储存方法及操作sdcard的工具类

Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类


(1)文件的目录

Android学习笔记之数据的Sdcard储存方法及操作sdcard的工具类

(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>


FileService.java也就是操作sdcard的工具类:

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>