Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 數據存儲-------外部存儲(SD卡) External Storage

Android 數據存儲-------外部存儲(SD卡) External Storage

編輯:關於Android編程

1, 特點

1, 插入sd卡

2, 分為兩部分: sd的公共目錄 sd的私有目錄

3, 公共目錄下的文件可以被應用程序共享, 私有目錄下的文件只能被當前應用程序訪問

4, 當程序卸載後, 公共目錄下的文件不會被清除, 私有目錄下的文件會被清除


2, 路徑

mnt/sdcard 4.0版本之前的目錄

storage/sdcard 4.0後的目錄 公共目錄

storage/sdcard/Android/data/應用程序包名/... 私有目錄


3, 讀寫sd卡的權限

WRITE_EXTERNAL_STORAGE 寫sd卡的權限

READ_EXTERNAL_STOAGE 讀sd卡的權限

4, 獲取擴展卡的根目錄

Environment.getExternalStorageDirectory()

5, 獲取當前擴展卡的狀態

Environment.getExternalStorageState()

MEDIA_MOUNTED 掛載的狀態, sd卡已經被裝載並且可以使用, 判斷存儲的狀態符合該條件, 則能進行存取文件


6, 目錄

context.getExternalFilesDir(null) 私有目錄的根目錄

context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOAD) 私有目錄中的download目錄中

context.getExternalCacheDir() 私有目錄中的緩存目錄

Environment.getExternalStorageDirectory() sd卡的根目錄

Environment.getExternalStorageDirectory(Environment.DIRECTORY_DOWNLOAD) 公共目錄中的download目錄中

 


package com.qf.day12_storage_external; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.qf.day12_storage_external.tools.HttpUtils; import com.qf.day12_storage_external.tools.SDCardUtils; public class MainActivity extends Activity { private ImageView iv; private String path = "http://img5.duitang.com/uploads/blog/201602/21/20160221193234_EtLYz.jpeg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } public void downLoad(View v) { //如果sd卡中有圖片, 則取出並顯示 Bitmap bitmap = SDCardUtils.getBitmap(path); if(bitmap!=null) { iv.setImageBitmap(bitmap); } else { //如果sd卡中沒有圖片, 開啟異步任務下載圖片, 並且將下載好的圖片存入sd卡中 new MyTask().execute(path); } } public void show(View v) { Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); } /** * 自定義 異步任務 下載圖片 * @author Administrator * */ public class MyTask extends AsyncTask { @Override protected Bitmap doInBackground(String... params) { // TODO 下載圖片 byte[] data = HttpUtils.getByteResult(params[0]); if(data!=null && data.length>0) { //將下載好的圖片, 存入sd卡中 SDCardUtils.saveImg(params[0], data); return BitmapFactory.decodeByteArray(data, 0, data.length); } return null; } @Override protected void onPostExecute(Bitmap result) { // TODO 更新UI super.onPostExecute(result); if(result!=null) { iv.setImageBitmap(result); Toast.makeText(MainActivity.this, "圖片下載成功!!", Toast.LENGTH_SHORT).show(); }else Toast.makeText(MainActivity.this, "數據加載失敗,請稍後再試...", Toast.LENGTH_SHORT).show(); } } } 

package com.qf.day12_storage_external;

import com.qf.day12_storage_external.tools.SDCardUtils;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class SecondActivity extends Activity {

	private EditText nameEdit,contentEdit;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		
		nameEdit = (EditText) findViewById(R.id.file_name);
		contentEdit = (EditText) findViewById(R.id.content_id);
	}

	//保存
	public void save(View v)
	{
		//得到輸入框的內容
		String fileName = nameEdit.getText().toString().trim();
		String content = contentEdit.getText().toString().trim();
		
		//向sd卡的私有目錄中存入數據
		SDCardUtils.savePrivate(this,fileName,content);
	}
	
	//打開
	public void open(View v)
	{
		String fileName = nameEdit.getText().toString().trim();
		
		//根據名稱  從sd卡的私有目錄中得到內容
		String content = SDCardUtils.open(this,fileName);
		
		contentEdit.setText(content);
	}

}

package com.qf.day12_storage_external.tools;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * Http 加載網絡數據
 * @author Administrator
 *
 */
public class HttpUtils {

	/**
	 * 加載網絡數據  
	 * @param path  路徑
	 * @return  String
	 */
	public static String getStringResult(String path) {
		
		HttpURLConnection conn  = null;
		InputStream is  = null;
		try {
			
			//1, 得到URL 對象
			URL url = new URL(path);
			
			//2, 打開連接
			
			 conn = (HttpURLConnection) url.openConnection();
			
			//3, 設置請求方式
			conn.setRequestMethod("GET");
			
			//4, 連接
			conn.connect();
			
			//5, 判斷返回的結果碼 (200),得到響應數據
			if(conn.getResponseCode() == 200)
			{
				is = conn.getInputStream();
				
				StringBuilder sBuilder = new StringBuilder();
				
				byte[] buffer  = new  byte[1024];
				
				int len = 0;
				
				while ((len = is.read(buffer))!=-1) {
					
					sBuilder.append(new String(buffer,0,len));
				}
				
				return sBuilder.toString();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			if(conn!=null)
			{
				conn.disconnect();
			}
			if(is!=null)
			{
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
		return null;
	}

	
	/**
	 * 加載網絡圖片
	 * @param path
	 * @return byte[]
	 */
	public static byte[] getByteResult(String path)
	{
		HttpURLConnection conn = null;
		InputStream is =  null;
		ByteArrayOutputStream baos = null;
		try {
			
			//1, 得到URL 對象
			URL url = new URL(path);
			
			//2, 打開連接
			
			 conn = (HttpURLConnection) url.openConnection();
			
			//3, 設置請求方式
			conn.setRequestMethod("GET");
			
			//4, 連接
			conn.connect();
			
			//5, 判斷返回的結果碼 (200),得到響應數據
			if(conn.getResponseCode() == 200)
			{
				is = conn.getInputStream();
				
				baos = new ByteArrayOutputStream();
				
				byte[] buffer = new byte[1024];
				
				int len = 0;
				
				while ((len=is.read(buffer))!=-1) {
					
					baos.write(buffer, 0, len);
					baos.flush();
				}
				
				return baos.toByteArray();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			if(conn!=null)
			{
				conn.disconnect();
			}
			if(is!=null)
			{
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(baos!=null)
			{
				try {
					baos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
		return null;
	}
}

package com.qf.day12_storage_external.tools;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;

/**
 * sd 卡的存儲
 * @author Administrator
 *
 */
public class SDCardUtils {
	
	//保存圖片的目錄
	//private static final String PATH = Environment.getExternalStorageDirectory()+"/1614/img/";
	
	private static final String PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+File.separator;
	/**
	 * 判斷當前的sd卡是否可用
	 * 
	 * MEDIA_MOUNTED SD的可用狀態
	 * @return
	 */
	public static boolean  isMounted()
	{
		//1, 得到當前sd的狀態
		String state = Environment.getExternalStorageState();
		
		//2, 跟系統提供的掛載狀態比較
		return state.equals(Environment.MEDIA_MOUNTED);
	}
	
	/**
	 * 從圖片路徑中, 獲取圖片的名稱
	 * @param path
	 * @return
	 */
	public static String getFileName(String path)
	{
		return path.substring(path.lastIndexOf("/")+1);
	}
	
	/**
	 * 保存圖片到sd卡的公共目錄中
	 * @param path  圖片的路徑  (截取圖片名稱)
	 * @param data  圖片內容
	 * @throws Exception 
	 */
	public static void saveImg(String path,byte[] data)
	{
		FileOutputStream fos = null;
		try {
			//1, 判斷當前的sd卡是否可用
			if(!isMounted()) return;
			
			//2, 判斷當前緩存的目錄是否存在, 如果不存在  級聯創建
			File dir = new File(PATH);
			if(!dir.exists())
			{
				dir.mkdirs();//級聯創建
			}
			
			//3, 將圖片的字節,寫入到指定的文件中
			fos = new FileOutputStream(new File(dir, getFileName(path)));
			
			fos.write(data);
			
			
		} catch (Exception e) {

			e.printStackTrace();
		}finally
		{
			try {
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
	
	/**
	 * 根據圖片的名稱,  從sd卡的公共目錄中, 讀取圖片內容
	 * @param path
	 * @return
	 */
	public static Bitmap getBitmap(String path)
	{
		if(!isMounted()) return null;
		
		File file = new File(PATH, getFileName(path));
		
		if(file.exists())
		{
			//把絕對路徑中的圖片  轉成Bitmap格式
			return BitmapFactory.decodeFile(file.getAbsolutePath());
		}
		
		return null;
	}

	
	/**
	 * 向Sd卡的私有目錄中寫入內容
	 * @param fileName
	 * @param content
	 */
	public static void savePrivate(Context context,String fileName, String content) {
		
		//判斷sd卡的狀態是否可用
		if(!isMounted()) return;
		//Sd卡的私有根目錄 context.getExternalFilesDir(null)
		//context.getExternalCacheDir()  緩存中
		File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), fileName);
		
		FileOutputStream fos = null;
		try {
			
			fos = new FileOutputStream(file);
			
			fos.write(content.getBytes());
			
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		finally
		{
			if(fos!=null)
			{
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 根據文件名稱   讀取外部存儲私有目錄中的文件內容
	 * @param context
	 * @param fileName
	 * @return
	 */
	public static String open(Context context, String fileName) {
		
		String result = null;
		
		if(!isMounted()) return result;
		
		//創建外邊存儲的文件對象
		//context.getExternalCacheDir()  緩存中
		File file  = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), fileName);
		
		FileInputStream fis = null;
		BufferedReader reader = null;
		StringBuilder sBuilder = new StringBuilder();
		
		try {
			fis = new FileInputStream(file);
			
			reader = new BufferedReader(new InputStreamReader(fis));
			
			String line = null;
			
			while ((line= reader.readLine())!=null) {
				
				sBuilder.append(line);
				
			}
			
			result = sBuilder.toString();
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}finally{
			
			if(fis!=null)
			{
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(reader!=null)
			{
				try {
					reader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		return result;
	}

	//----------------------
	/**
	 * 清除sd卡指定目錄中的數據
	 */
	public  static void clearCaches()
	{
		if(!isMounted()) return ;
		
		//得到緩存目錄中的文件
		File file = new File(PATH);
		
		if(file.exists())
		{
			//列出指定目錄中的所有文件
			File[] files = file.listFiles();
			
			for(File fl: files)
			{
				fl.delete();//刪除文件
			}
		}
	}

	
	/**
	 * 判斷sd卡的可用空間
	 */
	public static boolean isAvailable()
	{
		if(!isMounted()) return false;
		
		//1, 實例化文件管理系統的狀態對象  StatFs
		StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
		
		long size = 0;  //字節
		
		if(Build.VERSION.SDK_INT >=18)
		{
			size = statFs.getFreeBytes();
		}else
		{
			//可用的代碼塊  * 每個塊的大小
			size =  statFs.getFreeBlocks() * statFs.getBlockSize();
		}
		
		//可用空間必須大於10M , 則表示可以使用
		if(size > 10*1024*1024)
		{
			return true;
		}
		
		return false;
	}
	
}

\

 



 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved