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のファイルは読み書きできません.
二、アプリケーションパッケージ名ディレクトリ(すなわち/data/data/packagename)の下のファイルの読み書き
まずファイルを読む
Context.MODE_PRIVATE:デフォルトの操作モードであり、このファイルがプライベートデータであることを意味し、アプリケーション自身にしかアクセスできない.このモードでは、書き込まれた内容は元のファイルの内容を上書きし、新たに書き込まれた内容を元のファイルに追加したい場合はContext.MODE_を使用することができるAPPEND;
Context.MODE_APPEND:このモードではファイルが存在するかどうかをチェックし、存在する場合はファイルに内容を追加し、そうでない場合は新しいファイルを作成します.
Context.MODE_WORLD_READALBLE:現在のファイルが他のアプリケーションによって読み取れることを示す;
Context.WORLD_WRITEABLE:現在のファイルを他のアプリケーションに書き込むことができることを示します.
まずはSDカードからファイルを読み込む
本文では全く同じように紹介されていますが、実際に使用する際に最も基本的なファイル操作フローを採用しないことをお勧めします.前の文章で詳しく述べたので、ここでは議論しません.
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クラスの特徴や適用状況を深く分析します.本文では全く同じように紹介されていますが、実際に使用する際に最も基本的なファイル操作フローを採用しないことをお勧めします.前の文章で詳しく述べたので、ここでは議論しません.