Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的文件讀寫全面總結

Android中的文件讀寫全面總結

編輯:關於Android編程

 

在深入分析Java中的I/O類的特征及適用場合 一文中,我詳細介紹了Java中的I/O,但是,如果以為Android中的I/O與Java中一樣,那就大錯特錯了。實際上,它們有一定的相同之外,但更多的是區別,因為Android系統中的文件存放位置不同,讀取方式也不一樣。下面將詳細介紹Android中的文件讀寫:

一、資源文件的讀取,不需要在Manifest文件中添加權限

1.從resource中的asset中讀取文件,要注意的是asset中的文件只能讀而不能寫

 

public static void readFromAsset(Context context,String fileName)
	{
		try
		{
		    InputStream in=context.getResources().getAssets().open(fileName);
		    int length=in.available();
		    byte[]buffer=new byte[length];
		    
		    in.read(buffer);
		    in.close();
		    String content=new String(buffer,UTF-8);
		    ToastUtils.showShortToast(context, content);    
		
		}
	    catch(IOException e)
	    {
	    	e.printStackTrace();
	    }
			
	}
	
2.從resource的raw中讀取文件,與上面的一樣,也是只能讀取而不能寫入

 

 

public static void readFromRaw(Context context,int rawResId)
	{
	      InputStream in=context.getResources().openRawResource(rawResId);
	      try
	      {
	    	  int length=in.available();
		      byte[]buffer=new byte[length];
		      in.read(buffer);
		      
		      String res=EncodingUtils.getString(buffer, UTF-8);
		      
	      }
	     catch(IOException ex)
	     {
	    	 ex.printStackTrace();
	     }
	     finally
	     {
	    	 if(in!=null)
	    	 {
	    		 try
	    		 {
	    			 in.close();
	    		 }
	    		 catch(Exception e)
	    		 {
	    			 e.printStackTrace();
	    		 }
	    	 }
	     }
	}
看到上面兩段示例代碼可能有人會問,會什麼不想Java中那樣使用try(InputStream in=context.getResources().getAssets().open(fileName))這種autoclose的方式,但是實際上它需要Java SE1.7的版本才支持,而目前的Android版本並不支持,因而無法使用這種方法。

 

二、讀寫應用包名目錄(即/data/data/packagename)下的文件

首先是讀文件

 

public static void readFromPackage(Context context,String fileName)
	{
		try
		{
			FileInputStream fis=context.openFileInput(fileName);
			int length=fis.available();
			byte[]buffer=new byte[length];
			fis.read(buffer);
			
			String content=new String(buffer,UTF-8);
			ToastUtils.showLongToast(context, content);
		}
		catch(IOException ex)
		{
			ex.printStackTrace();
		}
	}
	
然後是寫文件,注意權限最好是Context.MODE_PRIVATE,否則有時候會觸犯安全紅線。目前的模式主要有以下幾種:

 

Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中,可以使用Context.MODE_APPEND;

Context.MODE_APPEND:該模式會檢查文件是否存在,若存在就往文件追加內容,否則就創建新文件;

Context.MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;

Context.WORLD_WRITEABLE:表示當前文件可以被其他應用寫入;

 

public static void writeToPackage(Context context,String fileName,String str)
	{
		try
		{
			FileOutputStream fos=context.openFileOutput(fileName,Context.MODE_PRIVATE);
			byte[]buffer=str.getBytes();
			
			fos.write(buffer);
			fos.close();
			
		}
		catch(IOException ex)
		{
			ex.printStackTrace();
		}
	}
三、讀寫sd卡中的文件,注意要添加以下權限:

 

首先是從SD卡讀取文件

 

     public void readFromSdcard(Context context,String fileName)
     {
    	 try
    	 {
    		 FileInputStream fis=new FileInputStream(fileName);
    		 int length=fis.available();
    		 byte[]buffer=new byte[length];
    		 fis.read(buffer);
    		 
    		 String content=new String(buffer,UTF-8);
    		 ToastUtils.showLongToast(context, content);		 
    	 }
    	 catch(IOException ex)
    	 {
    		 ex.printStackTrace();
    	 }
     }
然後是寫入文件到SD卡:

 

 

  public static void writeToSdCardFile(byte[]buffer,Context context,String fileName)
     {
    	 try
    	 {
    		 FileOutputStream fos=new FileOutputStream(fileName);
    		 fos.write(buffer);
    		 fos.close();
    	 }
    	 catch(IOException ex)
    	 {
    		 ex.printStackTrace();
    	 }
    	 
     }
當然,上面只是進行了最基礎的示例,至於獲取到文件流之後的包裝問題(如采用緩沖流等),就深入分析Java中的I/O類的特征及適用場合 一文中介紹得完全一樣了,也建議在實際使用時不要采用最基本的文件操作流,由於在之前的文章中詳細講過,這裡就不展開討論了。

 

 

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