English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Androidファイル操作の詳細と簡単な実例

 Android ファイル操作の詳細

Androidのファイル操作は、要するにJavaのファイル操作の処理です。したがって、Javaのioファイル操作に詳しい場合は、Androidのファイル操作は小さな問題です。それでは、話は長くなるので、今日の主題に入りましょう。

まずは小さなプロジェクトから始めてみましょう。

まずはレイアウトファイルから始めます。これは比較的単純なので、直接コードを示します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="文件名称" />
  <EditText 
    android:id="@"+id/et_filename"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="file name"
    />
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="文件内容" />
  <EditText 
    android:id="@"+id/et_filecontent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:lines="7"
    android:hint="file content"
    />
  <Button 
    android:id="@"+id/btn_save"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="toSave"
    android:text="Save"
    />
  <Button 
    android:id="@"+id/btn_get"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="getFile"
    android:text="Get"
    />
</LinearLayout>

それでは、メインのユーザーインターフェースのJavaファイルです。先ほどのコードを続けます。

package com.mark.storage;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.mark.service.FileService;
public class MainActivity extends Activity {
  private EditText mEt_filename, mEt_filecontent;
  private Button mBtn_save;
  private void init(){
    mEt_filecontent = (EditText) findViewById(R.id.et_filecontent);
    mEt_filename = (EditText) findViewById(R.id.et_filename);
    mBtn_save = (Button) findViewById(R.id.btn_save);
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
  }
  /**
   * データをファイルに保存する
   * @param view
   */
  public void toSave(View view) {
    String fileName = mEt_filename.getText().toString();
    String fileContent = mEt_filecontent.getText().toString();
    FileService service = new FileService(getApplicationContext());
    boolean isSucceed = service.save(fileName, fileContent);
    if(isSucceed){
      Toast.makeText(getApplicationContext(), "おめでとうございます、ファイルの保存に成功しました!", Toast.LENGTH_SHORT).show();
    } else {
      Toast.makeText(getApplicationContext(), "申し訳ありません、ファイルの保存に失敗しました!", Toast.LENGTH_SHORT).show();
    }
  }
  public void getFile(View view){
    String fileName = mEt_filename.getText().toString();
    FileService service = new FileService(getApplicationContext());
    String fileContent = service.getFile(fileName);
    if(fileContent != null || !fileContent.equals("")) {
      mEt_filecontent.setText(fileContent);
    } else {
      Toast.makeText(getApplicationContext(), "申し訳ありません、ファイルの読み取りに失敗しました!", Toast.LENGTH_SHORT).show();
    }
  }
}

コードが少し奇妙に感じられますか?FileServiceとは何ですか?

実際にはFileServiceは私たちのビジネスクラスであり、主にファイルの保存や読み取りなどの操作を実現する機能があります。以下にコードも示します。

package com.mark.service;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.content.Context;
public class FileService {
  //androidが提供する、ファイル出力ストリームを迅速に取得できるクラスです。注意していただきたいのは、パスの代わりにファイル名のみを指定できることです。
  private Context mContext;
  public FileService(Context context) {
    this.mContext = context;
  }
  /**
   * ファイルを保存するためのメソッド
   * @param fileName
   * @param fileContent
   * @return
   */
  public boolean save(String fileName, String fileContent) {
    try {
      //Context.MODE_PRIVATEモードを使用する場合、このファイルへのアクセスはこのアプリケーションのみに限定され、データを上書きして追加することができます
      FileOutputStream fos = mContext.openFileOutput(fileName, Context.MODE_PRIVATE);
      fos.write(fileContent.getBytes());
      fos.close();
      return true;
    catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
  /**
   * 保存されたファイルの詳細な情報を取得する
   * @param fileName
   * @return
   */
  public String getFile(String fileName) {
    String fileContent = "";
    try{
      FileInputStream fis = mContext.openFileInput(fileName);
      byte[] buf = new byte[1024];
      int len;
      ByteArrayOutputStream bais = new ByteArrayOutputStream();
      while((len = fis.read(buf))!= -1{
        bais.write(buf, 0, len);
      }
      byte[] data = bais.toByteArray();
      fileContent = new String(data);
      fis.close();
      return fileContent;
    }
      e.printStackTrace();
      return "ファイル読み込みに失敗しました!";
    }
  }
}

ビジネスクラスの分析

ここでは本題に入りましょう。この小さなプロジェクトのコアはこのビジネスクラスにあります。その理由は以下の通りです:

  1. Context:Androidに付属する上下文クラス、ファイルストリームオブジェクトを取得するのに便利です。
  2. ファイルを読み込むメソッドでは、ByteArrayOutputStream クラスが使用されており、これは非常に重要です。ストレージに保存されたファイルを読み込む際に単に文字列を使用するだけでは、シリアライゼーションの問題により目標データが取得できません。
  3. 操作結果に対して「フィードバック」を返すことでユーザーにフレンドリーなインターフェースと使いやすい体験を提供することができます。

コア

レイヤリングの考え方、異なる機能のクラスを異なるパッケージに配置することで、プログラムのデバッグが簡単になり、将来的なコードのメンテナンスも容易になります。

読んでいただきありがとうございます。皆様のサポートに感謝します!