數據的存儲有多種方式,比如數據庫存儲、SharedPreferences存儲、文件存儲等;
這裡我們將要介紹最簡單的文件存儲方式;
文件存儲簡單的來說就是一般的JAVASE中的IO流,只是把他應用於Android手機中而已;
一、文件存儲核心代碼
文件存儲
(1)FileOutputStream out = context.openFileOutput(String filename,int mode); 以mode模式獲得文件輸出流
(2)out.write(byte[]b);
- FileOutputStream out = null;
- out = context.openFileOutput(filename, Context.MODE_***);
- out.write(filecontent.getBytes("UTF-8"));
- out.close();
注意:文件默認會存儲到/data/data/package/files中;
文件讀取
(1)FileInputStream in = context.openFileInput(String filename); 獲得某個文件的文件流
(2)int length = in.read(byte[]);
- /*
- 每次讀取固定的字節,並將此字節輸出到字節輸出流中,當全部讀取完畢後,將字節流中的內容一並輸出
- */
- FileInputStream in = null;
- ByteArrayOutputStream bout = null;
- byte[]buf = new byte[1024];
- bout = new ByteArrayOutputStream();
- int length = 0;
- in = context.openFileInput(filename); //獲得輸入流
- while((length=in.read(buf))!=-1){
- bout.write(buf,0,length);
- }
- byte[] content = bout.toByteArray();
- filecontentEt.setText(new String(content,"UTF-8")); //設置文本框為讀取的內容
- in.close();
- bout.close();
注意:默認會讀取/data/data/package/files的文件;
二、文件模式介紹
1.Context.MODE_PRIVATE:私有覆蓋模式 - rw- rw- ---
只能被當前應用訪問,並且如果寫入,則覆蓋;
2.Context.MODE_APPEND:私有追加模式 - rw- rw- ---
只能被當前應用訪問,並且如果寫入,則追加;
3.Context,MODE_WORLD_READABLE:公有只讀模式 - rw- rw- r--
可以被其他應用讀取;
4.Context.MODE_WORLD_WRITEABLE:公有可寫模式 - rw- rw- -w-
可以被其他應用寫入,但不能讀取;
注意,如果希望其他使得文件模式疊加,則可以使用加號連接;
比如:Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE 表示其他應用讀寫;
三、簡單應用實例
1.效果圖
目標:當點擊保存時,將以特定的文件名稱和特定的文件內容保存內容,點擊讀取時,將讀取特定的文件的文件內容顯示到文件內容文本框;
當點擊保存之後,效果如下:
MainActivity.java
- package org.xiazdong.file;
-
- import java.io.ByteArrayOutputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
-
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
-
- public class MainActivity extends Activity {
- private Button saveButton,readButton;
- private EditText filenameEt,filecontentEt;
- private Context context = this;
- private OnClickListener listener = new OnClickListener(){
- @Override
- public void onClick(View v) {
- if(v==saveButton){
- String filename = filenameEt.getText().toString();
- String filecontent = filecontentEt.getText().toString();
- FileOutputStream out = null;
- try {
- out = context.openFileOutput(filename, Context.MODE_PRIVATE);
- out.write(filecontent.getBytes("UTF-8"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- finally{
- try {
- out.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- else if(v==readButton){
- String filename = filenameEt.getText().toString(); //獲得讀取的文件的名稱
- FileInputStream in = null;
- ByteArrayOutputStream bout = null;
- byte[]buf = new byte[1024];
- bout = new ByteArrayOutputStream();
- int length = 0;
- try {
- in = context.openFileInput(filename); //獲得輸入流
- while((length=in.read(buf))!=-1){
- bout.write(buf,0,length);
- }
- byte[] content = bout.toByteArray();
- filecontentEt.setText(new String(content,"UTF-8")); //設置文本框為讀取的內容
- } catch (Exception e) {
- e.printStackTrace();
- }
- filecontentEt.invalidate(); //刷新屏幕
- try{
- in.close();
- bout.close();
- }
- catch(Exception e){}
- }
- }
-
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- saveButton = (Button)this.findViewById(R.id.saveButton);
- readButton = (Button)this.findViewById(R.id.readButton);
- filenameEt = (EditText)this.findViewById(R.id.filename);
- filecontentEt = (EditText)this.findViewById(R.id.filecontent);
- saveButton.setOnClickListener(listener);
- readButton.setOnClickListener(listener);
- }
- }