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

Подробное объяснение операций с файлами в Android и простые примеры

 Подробное описание операций с файлами в Android

Операции с файлами в Android на самом деле это обработка операций с файлами в Java. Таким образом, если вы хорошо знакомы с операциями с файлами io в Java, операции с файлами в Android будут для вас легким делом. Хорошо, не будем терять время, перейдем к сегодняшней теме.

Начнем с маленького проекта

Сначала это файл布局, это довольно просто, давайте перейдем direkt к коду.

<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. Использование возвращаемых значений для «отображения» результатов операции, что удобно для предоставления пользователям дружественного интерфейса и опыта использования.

Ядро

Идея уровней, классы с различными функциями размещаются в различных пакетах, что упрощает отладку программы и обслуживание кода в будущем.

Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!

Рекомендуем также