在android应用开发中,有时需要对应用中的数据进行保存;Android保存数据的方式有一下几种:
文件 SharedPreference SqlLite数据库 ContentProvider 网络;
对于文件存储数据,android为每个应用提供了独立的文件存储位置:data/data/${yourapp}/files;
保存数据到文件中时,可以通过context对象的openFileOutput(fileName, Context.MODE_PRIVATE);方法获取对应文件夹下指定文件的输出流;
然后通过outputStream的write(byte),将数据保存到文件中;
这个方法的第一个参数时指定的文件名,第二个参数时该文件被操作时的权限;Context.MODE_PRIVATE表示私有权限,代表该文件只能被本应用读写,并且新增的内容会覆盖原有内容;
还有三种权限分别是:
Context.MODE_APPEND:检查时否存在文件,存在就追加模式,不存在就创建,也为私有模式,其他应用不可用。
Context.MODE_WORLD_READABLE:该模式允许其他应用从该文件中读取内容。
Context.MODE_WORLD_WRITEABLE:该模式允许其他应用相该文件写入内容。
另外:
Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE:其他应用可读可写。
Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE+ Context.MODE_APPEND:其他应用可读可写,可写的时候是追加模式;
具体例子:MainActivity:
package tk.sweetvvck.fileopt; import java.io.IOException; import tk.sweetvvck.service.FileOptService; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) this.findViewById(R.id.save_button); button.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { if(v.getId() == R.id.save_button){ EditText fileNameText = (EditText) this.findViewById(R.id.file_name_text); EditText fileContentText = (EditText) this.findViewById(R.id.file_content_text); String fileName = fileNameText.getText().toString(); String fileContent = fileContentText.getText().toString(); FileOptService service = new FileOptService(this.getApplicationContext()); try { service.saveFile(fileName, fileContent); Toast.makeText(this.getApplicationContext(), R.string.save_successfully, Toast.LENGTH_SHORT).show(); } catch (IOException e) { Toast.makeText(this.getApplicationContext(), R.string.save_failed, Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } } }
文件保存与读取业务类:
package tk.sweetvvck.service; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; /** * * @author sweetvvck * */ public class FileOptService { private Context context; public FileOptService(Context context) { this.context = context; } /** * 保存文件 * @param fileName * @param fileContent * @throws IOException */ public void saveFile(String fileName, String fileContent) throws IOException { FileOutputStream out = context.openFileOutput(fileName, Context.MODE_PRIVATE); out.write(fileContent.getBytes()); out.close(); } /** * 读取文件中的内容 * @param fileName * @return * @throws IOException */ public String readFile(String fileName) throws IOException{ FileInputStream in = context.openFileInput(fileName); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } byte[] data = out.toByteArray(); in.close(); out.close(); return new String(data); } }单元测试类:
import java.io.IOException; import tk.sweetvvck.service.FileOptService; import android.test.AndroidTestCase; import android.util.Log; public class FileServiceTest extends AndroidTestCase { private static final String TAG = "FileServiceTest"; public String testReadFile() throws IOException{ FileOptService service = new FileOptService(this.getContext()); String result = service.readFile("吧"); Log.i(TAG, result); return null; } }