Androidプログラミングのファイルの読み書きの実例


本論文の実例はAndroidプログラミングのファイルの読み書き方法を分析する。皆さんに参考にしてあげます。具体的には以下の通りです。
Androidのファイルの読み書きはJavaSEのファイルの読み書きと同じで、IOストリームを使用しています。そしてAndroidはJavaSEのIOストリームを使っています。次は練習を通してAndroidのファイルを読み、書きます。
1.Androidプロジェクトを作成する
プロジェクトname:File
    BuildTarget:Android 2.2
    アプリname:ファイル読み書き
    Package name:test.file
    Create Activity:DateActivity
    Min SDK Version:8
strigs.xmlファイルの内容:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 <string name="app_name">    </string> 
 <string name="file_name">   </string> 
 <string name="file_content">    </string> 
 <string name="button_file_save">  </string> 
 <string name="button_file_read">  </string> 
 <string name="file_save_success">      </string> 
 <string name="file_save_failed">      </string> 
 <string name="file_read_failed">      </string> 
</resources>

mail.xmlファイルの内容:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <!--     --> 
  <TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="@string/file_name" /> 
  <EditText android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:id="@+id/et_file_name" /> 
  <TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="@string/file_content" /> 
  <EditText android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:minLines="3" 
    android:id="@+id/et_file_content" /> 
  <RelativeLayout android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <Button android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:text="@string/button_file_save" 
      android:id="@+id/bt_save" /> 
    <Button android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:layout_toRightOf="@id/bt_save" 
      android:text="@string/button_file_read" android:id="@+id/bt_read" 
      android:layout_alignTop="@id/bt_save" 
      /> 
  </RelativeLayout> 
</LinearLayout>

javaコードを追加
まずプロジェクトにFileService.javaを追加します。実はjavaの中のファイル操作です。

package test.service; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import android.content.Context; 
import android.os.Environment; 
public class FileService { 
private Context context; 
public FileService(Context context) { 
this.context = context; 
} 
public void saveToSDCard(String filename, String content) throws Exception{ 
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 
File file = new File(Environment.getExternalStorageDirectory(), filename); 
FileOutputStream outStream = new FileOutputStream(file); 
outStream.write(content.getBytes()); 
outStream.close(); 
} 
} 
public void save(String filename, String content) throws Exception{ 
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_PRIVATE); 
outStream.write(content.getBytes()); 
outStream.close(); 
}

そしてプロジェクトにFileButton OnClickEvent.javaを追加します。

package test.event; 
import test.file.R; 
import test.service.FileService; 
import android.app.Activity; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
public class FileButtonOnClickEvent implements OnClickListener { 
 private Activity activity; 
 //   FileService     
 private FileService fileService; 
 //          
 private static final String TAG = "FileButtonOnClickEvent"; 
 public FileButtonOnClickEvent(Activity activity) { 
  this.activity = activity; 
   this.fileService = new FileService(activity); 
 } 
public void onClick(View v) { 
Button button = (Button) v; 
  switch (button.getId()) { 
  case R.id.bt_save: 
    //       
    EditText etFileNameS = (EditText) this.activity 
        .findViewById(R.id.et_file_name); 
    String fileNameS = etFileNameS.getText().toString(); 
    //        
    EditText etFileConS = (EditText) this.activity 
        .findViewById(R.id.et_file_content); 
    String fileContentS = etFileConS.getText().toString(); 
    //    
    try { 
      this.fileService.save(fileNameS, fileContentS); 
      //               
      Toast.makeText(this.activity, R.string.file_save_success,
         Toast.LENGTH_LONG).show(); 
      Log.i(TAG, "save file success!"); 
    } catch (Exception e) { 
      Toast.makeText(this.activity, R.string.file_save_failed, 
         Toast.LENGTH_LONG).show(); 
      Log.e(TAG, e.toString()); 
    } 
    break; 
  case R.id.bt_read: 
    //       
    EditText etFileNameR = (EditText) this.activity 
        .findViewById(R.id.et_file_name); 
    String fileNameR = etFileNameR.getText().toString(); 
    //      
    try { 
      String fielContentR = this.fileService.readFile(fileNameR); 
      EditText etFileConR = (EditText) this.activity 
         .findViewById(R.id.et_file_content); 
      etFileConR.setText(fielContentR); 
      Log.i(TAG, "read file success!"); 
    } catch (Exception e) { 
      Toast.makeText(this.activity, R.string.file_read_failed, 
         Toast.LENGTH_LONG).show(); 
      Log.e(TAG, e.toString()); 
    } 
    break; 
  default: 
    break; 
  } 
} 
} 
public void saveAppend(String filename, String content) throws Exception{// ctrl+shift+y / x 
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_APPEND); 
outStream.write(content.getBytes()); 
outStream.close(); 
} 
public void saveReadable(String filename, String content) throws Exception{// ctrl+shift+y / x 
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE); 
outStream.write(content.getBytes()); 
outStream.close(); 
} 
public void saveWriteable(String filename, String content) throws Exception{// ctrl+shift+y / x 
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_WRITEABLE); 
outStream.write(content.getBytes()); 
outStream.close(); 
} 
public void saveRW(String filename, String content) throws Exception{ 
FileOutputStream outStream = context.openFileOutput(filename, 
Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE); 
outStream.write(content.getBytes()); 
outStream.close(); 
} 
public void savePRW(String filename, String content) throws Exception{ 
FileOutputStream outStream = context.openFileOutput(filename, 
Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE+Context.MODE_APPEND);
outStream.write(content.getBytes()); 
outStream.close(); 
} 
public String readFile(String filename) throws Exception{ 
FileInputStream inStream = context.openFileInput(filename); 
byte[] data = readData(inStream); 
return new String(data); 
} 
private byte[] readData(FileInputStream inStream) throws Exception{ 
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
byte[] buffer = new byte[1024]; 
int len = 0; 
while( (len = inStream.read(buffer))!= -1){ 
outStream.write(buffer, 0, len); 
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
}

最後は私達の主なActivity:DateActivityです。

package test.file; 
import test.event.FileButtonOnClickEvent; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Button; 
public class DateActivity extends Activity { 
 /** Called when the activity is first created. */ 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  //        
  Button buttonRead = (Button) this.findViewById(R.id.bt_read); 
  Button buttonSave = (Button) this.findViewById(R.id.bt_save); 
  //         
  FileButtonOnClickEvent fileBtOnClickEve = new FileButtonOnClickEvent(this); 
  buttonRead.setOnClickListener(fileBtOnClickEve); 
  buttonSave.setOnClickListener(fileBtOnClickEve); 
 }
}

私たちのDateActivity.javaの可読性はいいですか?もちろんです今後も引き続き改善します。しかし、私たちのFileServiceはインタフェースを使っていません。JavaEEではインタフェースを使って開発しています。Androidでは携帯電話のOSのプラットフォームですので、もし私達が開設しているクラスが多いと、システムの資源を占用して、システムが遅くなります。だから、できるだけインターフェースやクラスの定義を減らしますが、プログラムの可読性がいいようにします。ですから、DataActivityとFileButton OnClickEventを統合することもできます。
シミュレータを起動して、プログラムを展開します。ファイル名とファイル内容を入力し、保存をクリックします。ファイルはAndroidのどこに保存されていますか?私たちはAndroidがLinuxに基づいて実現されることを知っています。そのため、ルートディレクトリは「/」であり、ファイルは「data/data/あなたのバッグ名.file/files」ディレクトリに保存されています。
メニューWindows->Show View->Other...->Android->File Explorerを通じて、File Explorerパネルを開くこともできます。これを通じてAndroidのディレクトリ構造を確認できます。
data:アプリケーションデータは、私たちが保存しているファイルは/data/packagename/filesです。
sdcard:今の携帯は一般的にSDカードを外挿できます。このカタログはSDカードのカタログです。このディレクトリを操作するには、メインプロファイルに操作権限を登録する必要があります。
system:Androidオペレーティングシステムのファイルは変更しないでください。
File Explorerの右上にある「フロッピーディスク左矢印」アイコンをクリックしてファイルをエクスポートできます。
OopenFileOutput()メソッドの最初のパラメータはファイル名を指定するために使用されます。パス区切り記号「/」は含まれません。ファイルが存在しない場合、Androidは自動的に作成されます。作成したファイルは/data/data//filesディレクトリに保存されています。
openFileOutput()メソッドの第二パラメータは、動作モードを指定するために使用されます。
Conttext.MODE_PRIVATE  = 0
Conttext.MODE_APPEND  = 32768
Conttext.MODE_WORLD_READABLE=1
Conttext.MODE_WORLD_WRITEABLE=2
Conttext.MODE_PRIVATE:デフォルト動作モードのために、このファイルはプライベートデータであり、アプリケーション自体でしかアクセスできません。このモードでは、書き込みの内容は元のファイルの内容を上書きします。新しい書き込みの内容を元のファイルに追加したい場合は。Conttext.MODE_を使用できます。APPEND
Conttext.MODE_APPEND:モードはファイルが存在するかどうかを確認します。存在するとファイルに内容を追加します。そうでないと新しいファイルを作成します。このモードはプライベートデータでもあり、アプリケーション自体でしかアクセスできません。
Conttext.MODE_WORLD_READABLEとConttext.MODE_WORLD_WRITEABLEは他のアプリケーションを制御するためにこのファイルを読み書きする権限がありますか?
MODE_WORLD_READABLE:現在のファイルは他のアプリケーションで読み込むことができることを示します。MODE_WORLD_WRITEABLE:現在のファイルは他のアプリケーションで書き込めるという意味です。
これらの権限を使用して接続できます。
他のアプリケーションによってファイルを読み、書きたい場合は、
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
他のアプリケーションによって文書を読んだり書いたりする場合は、追加の内容が必要です。
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE+ Context.MODE_APPEND);
Androidには独自のセキュリティモデルがあり、アプリケーション(.appk)がインストールされているときには、システムは彼のuseridに割り当てられます。このアプリケーションがファイルなどの他のリソースにアクセスするには、useridマッチングが必要です。デフォルトでは、任意のアプリケーションで作成されたファイル、sharepreferences、データベースはすべてプライベートであるべきです(位置/data/data//files)、他のプログラムはアクセスできません。作成時にConttext.MODE_を指定しない限りWORLD_READABLEまたはConttext.MODE_WORLD_WRITEABLEでは、他のプログラムが正しくアクセスできます。
OutputStreamと同様に、ContectオブジェクトからFileInputStream openFileInputを呼び出して、現在のアプリケーションのプライベートファイルディレクトリの下にあるファイル名をnameというファイルのInputStreamを開くことができます。ファイルが存在しない場合は、直接FileNotFoundExceptionに異常があります。
また、アプリケーションがプロジェクトプロジェクトプロジェクトのカタログからデータを読み出す必要がある場合、Conteetオブジェクトを呼び出してファイル名をnameファイルとして開くことができます。InputStream:InputStream in=this.gets Asets.open(name);
Contextオブジェクトは、ファイル名がnameというファイルを、fileList()メソッドを呼び出してプライベートファイルディレクトリのすべてのファイル名からなる文字列配列を取得し、deleteFileを呼び出して削除することもできる。
Activityはまた、getCacheDir()とget FilesDir()の方法を提供する。
getCacheDir()メソッドは/data/data//cacheディレクトリを取得するために使用されます(一部の一時ファイルはキャッシュディレクトリに置いてもいいです。使い切ったら削除します)。
get Files Dir()メソッドは、/data/data//filesディレクトリを取得するために使用されます。
他のプログラムでファイルパスを取得する方法
1.絶対パス:/data/packagename/files/filename;
2.context:  context.get FilesDir()+「/filename」
キャッシュディレクトリ:data/data/packagename/CacheまたはgetCacheDir();
ファイルが大きすぎると、携帯のファイルディレクトリに保存できなくなり、SDカードに保存する必要があります。
Activityを使用したopenFileOutput()メソッドはファイルを保存して、ファイルは携帯電話の空間の上で保管して、普通の携帯電話の記憶空間はそんなに大きくなくて、小さいファイルを保管してもいいです。動画のような大きなファイルを保存するなら、いけません。動画のような大きなファイルについては、SDカードに保存できます。SDカードは何をするものですか?これをモバイルハードディスクやUSBメモリと見なすことができます。
シミュレータではSDカードを使います。まずSDカードを作成してください。SDCardを作成するには、Eclipseでシミュレータを作成する際に、DOSコマンドを使って作成することもできます。
DosウィンドウでAndroid SDKインストールパスのtoolsディレクトリに入り、以下のコマンドを入力して2 Gの容量のSDCardを作成します。ファイルの拡張子は自由に取ってもいいです。使用を推奨します。
mksdcard 2048 M D:\Android dTool\sdcard.img
プログラムでSDCardにアクセスするには、SDCardにアクセスする権限を申請する必要があります。
Android Manifest.xmlにSDCardにアクセスする権限は以下の通りです。

<!--  SDCard           -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--  SDCard       -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

sdcardに保存されたファイルはどのようなアプリケーションでもアクセスできます。
SDCardディレクトリ:/sdcard/またはEvironment.getExternal StrageDirectory()
SDCardディレクトリを使う前に、sdcard:Evironment.get External Stragetate()があるかどうかを判断する必要があります。このディレクトリを操作するには、メインプロファイルに操作権限を登録する必要があります。
Evironment.get External StrageState()がEvironment.MEDIA_に等しい場合MOUNTED  sdcardが存在し、読み書きができるという意味です。
File sdCard Dir=Evironment.get External StrageDirectory()//SDカードディレクトリの取得
File sdCard Dir=new File(\/sdcard)//。SDカードディレクトリの取得
SDカードにファイルを保存するには、まず携帯にSDカードがあるかどうかを判断し、読み書きができます。
注意:SDCardにアクセスするには、Android Manifest.xmlにSDCardにアクセスする権限を追加しなければなりません。

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
   File sdCardDir = Environment.getExternalStorageDirectory();//  SDCard  
   File saveFile = new File(sdCardDir, "itcast.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("     ".getBytes());
outStream.close();
}

Evironment.get External StrageState()はSDCardの状態を取得するための方法であり、携帯にSDCardが搭載されており、読み書きが可能であれば、方法が戻ってくる状態はEvironment.MEDIA_に等しい。MOUNTED。
Evironment.get External StrageDirectory()メソッドはSDカードのディレクトリを取得するために使用されます。もちろんSDカードのディレクトリを取得したいです。あなたもこのように書くことができます。

File sdCardDir = new File("/sdcard"); //  SDCard  
File saveFile = new File(sdCardDir, "itcast.txt"); 
//            : File saveFile = new File("/sdcard/itcast.txt");
//            : File saveFile = new File(Environment.getExternalStorageDirectory(), "itcast.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("     ".getBytes());
outStream.close();

ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。