Androidの中のファイルの読み書きの全面的な総括


転載は出典を明記してください.http://blog.csdn.net/bettarwang/article/details/41625187
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();
	    		 }
	    	 }
	     }
	}
      上記の2つのサンプルコードを見ると、Javaのようにtry(InputStreamin=context.getResources().getAssets(..open(fileName))というautocloseを使用したくない方法は何かと聞かれるかもしれませんが、実際にはJava SE 1.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_READALBLE:現在のファイルが他のアプリケーションによって読み取れることを示す;
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クラスの特徴や適用状況を深く分析します.
 本文では全く同じように紹介されていますが、実際に使用する際に最も基本的なファイル操作フローを採用しないことをお勧めします.前の文章で詳しく述べたので、ここでは議論しません.