Android中的文件存储数据方式

转自以下文章:

http://blog.csdn.net/zuolongsnail/article/details/6559338

http://blog.csdn.net/xiazdong/article/details/7687439

http://www.cnblogs.com/feisky/archive/2011/01/05/1926177.html

 

 

1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法。
创建的存储文件保存在/data/data/<package name>/files文件夹下。

 

 

2.操作。
保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式。
读取文件内容:通过Context.openFileInput获取输入流,参数为文件名。
删除文件:Context.deleteFile删除指定的文件,参数为将要删除的文件的名称。
获取文件名列表:通过Context.fileList获取files目录下的所有文件名数组。
*获取文件路径的方法:
绝对路径:/data/data/<package name>/files/filename
Context:Context.getFilesDir()可以获取到"/data/data/<package name>/files"

 

3.四种文件保存的模式。
Context.MODE_PRIVATE 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
Context.MODE_APPEND 检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE 表示当前文件可以被其他应用读取。
MODE_WORLD_WRITEABLE 表示当前文件可以被其他应用写入。
在使用模式时,可以用"+"来选择多种模式,比如openFileOutput(FILENAME, Context.MODE_PRIVATE + MODE_WORLD_READABLE);

 

 

 

简单应用实例

 

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);  
    }  
}  

  

2、将文件保存到SDCard

 

如果一个文件很大,则不适用于存放在手机的存储中;

如果手机存在sdcard,则sdcard的目录为/mnt/sdcard目录;

 

步骤1:设置模拟器支持sdcard

 

 

此时模拟器已经支持sdcard了;

 

步骤2:在应用中设置权限

 

在程序中访问SDCard,你需要申请访问SDCard的权限。

在AndroidManifest.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必须在AndroidManifest.xml中加入访问SDCard的权限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

         File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

         File saveFile = new File(sdCardDir, “a.txt”);

       FileOutputStream outStream = new FileOutputStream(saveFile);

         outStream.write("test".getBytes());

         outStream.close();

}

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:

File sdCardDir = new File("/sdcard"); //获取SDCard目录

File saveFile = new File(sdCardDir, "itcast.txt"); 

//上面两句代码可以合成一句: File saveFile = new File("/sdcard/a.txt");

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();

  

 

posted @ 2016-07-30 08:17  324四哥  阅读(480)  评论(0编辑  收藏  举报