Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 存儲學習之在外部存儲中讀寫文件

Android 存儲學習之在外部存儲中讀寫文件

編輯:關於Android編程

上節學習了如何在手機內部存儲中讀寫文件,本節學習如何在手機的外部存儲中讀寫文件。那就是如何在Sdcard中讀寫文件。

那我們還是用以前登錄界面的例子舉例說明,(登錄界面請看上節Android 存儲學習之在內部存儲中讀寫文件)

先我們顯示寫的代碼:

當點擊確定並且自動登錄的鉤是選中的,則就會在sdcard文件夾寫創建一個info.txt文件

 

public void login(View v)
    {
    	String name = ed_nam.getText().toString();
    	
    	String passwd = ed_passwd.getText().toString();
    	
    	//判斷用戶名或者密碼是否輸入
    	if((name.equals()) || (passwd.equals()))
    	{
    		Toast.makeText(this, 用戶名或密碼不能為空, Toast.LENGTH_SHORT).show();
    	}
    	else 
    	{
    		//如果選中自動登錄,我們就需要保存用戶名和密碼
    		if(cb.isChecked())
    		{
    			//創建一個文件,用戶保存用戶名和密碼
    			File file = new File(sdcard/info.txt);
    			try {
    				
					FileOutputStream fos = new FileOutputStream(file);
					//寫入用戶名和密碼,以name##passwd的格式寫入
					fos.write((name + ## + passwd).getBytes());
					//關閉輸出流
					fos.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    		
    		Toast.makeText(this, 登錄成功, Toast.LENGTH_SHORT).show();
		}
    }
}

 

執行後,顯示效果如下:

\

同理讀也就是將上節讀取的路徑改為sdcard的路徑即可:

 

public void readInfo()
	{
		
		File file = new File(sdcard/info.txt);
		
		//如果文件存在,則讀取
		if(file.exists())
		{
			try {
				
				FileInputStream fin = new FileInputStream(file);
				//把字節流轉化為字符流
				BufferedReader buffer = new BufferedReader(new InputStreamReader(fin));
				//讀取文件中的用戶名和密碼
				String text = buffer.readLine();
				//以##為關鍵字分割字符
				String s[] = text.split(##);
				
				//設置進EditText
				ed_nam.setText(s[0]);
				ed_passwd.setText(s[1]);
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

當然了,同理可知到。我們上面那些寫Sdcard的路徑是不對的,程序的健壯性不是很高,那就的用Google提供的訪問sdcard的API:getExternalStorageDirectory

 

 

    			//創建一個文件,用戶保存用戶名和密碼
    			//File file = new File(sdcard/info.txt);
    			File file = new File(Environment.getExternalStorageDirectory(), info.txt);
設想一種情況,當我們往sdcard中寫一個文件,但是由於sdcard容量有限,不足與放下此文件,所以在用戶打算放入一個文件到sdcard中時,需要先判斷存儲空間是不滿足,不滿足請用戶給予提醒即可。

 

那如何獲得sdcard的當前可用容量:

//用戶判斷是否文件大小超過sdcard的容量
public Boolean sdcardAvailable(int size)
{
	File file = Environment.getExternalStorageDirectory();
	StatFs stat = new StatFs(file.getPath());
	
	//每個塊的大小
	long blockSize = stat.getBlockSize();
	//公共分為多少個塊
	long totalBlocks = stat.getBlockCount();
	//共有多少可用的空間,單位為字節
	long availableBlocks = stat.getAvailableBlocks();
	
	if(availableBlocks > size)
	{
		return true;
	}
	return false;
}


 

當寫入一個文件時,先和sdcard的可用空間比較即可:

 

 

try {
    				
					FileOutputStream fos = new FileOutputStream(file);
					//寫入用戶名和密碼,以name##passwd的格式寫入
					
					//要寫入的數據長度,單位是字節
					int len = (name + ## + passwd).getBytes().length/8;
					if(sdcardAvailable(len))
					{
						fos.write((name + ## + passwd).getBytes());
					}
					else {
						Toast.makeText(this, sdcard存儲空間不足, Toast.LENGTH_SHORT).show();
					}
					
					//關閉輸出流
					fos.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

這樣就能避免文件過大,寫到一半出現容量不足的情況。

 

 

再設想一種情況,當我們突然往sdcard中寫入內容時,如果sdcard出現某些問題,沒有掛載,那也是不能寫入東西的。所以,讀寫之前需要判斷sdcard是否正常運行

 

if(cb.isChecked())
    		{
	    			//創建一個文件,用戶保存用戶名和密碼
	    			//File file = new File(sdcard/info.txt);
	    			
	    			/* MEDIA_CHECKING: sd卡正在准備
	    			 * MEDIA_MOUNTED:sd卡已經掛載,並且正在讀寫訪問 
	    			 * MEDIA_REMOVED:沒有sd卡
	    			 * MEDIA_UNKNOWN:不能識別sd卡
	    			 * MEDIA_UNMOUNTED:sd卡存在,但沒有掛載
	    			 * */
	    			if(Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED))
	    			{
	    			
	    			File file = new File(Environment.getExternalStorageDirectory(), info2.txt);
	
	    			try {
	    				
						FileOutputStream fos = new FileOutputStream(file);
						//寫入用戶名和密碼,以name##passwd的格式寫入
						
						//要寫入的數據長度,單位是字節
						int len = (name + ## + passwd).getBytes().length/8;
						if(sdcardAvailable(len))
						{
							fos.write((name + ## + passwd).getBytes());
						}
						else {
							Toast.makeText(this, sdcard存儲空間不足, Toast.LENGTH_SHORT).show();
						}
						
						//關閉輸出流
						fos.close();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
	    		}
    		}
    		Toast.makeText(this, 登錄成功, Toast.LENGTH_SHORT).show();
		}


 

也就是在讀寫時,先判斷sdcard是否已經正在運行,如果sdcard的狀態是ok的。則執行接下來的操作即可
 

 

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