数据存储-文件I/O

——文件I/O
——Internal Storage:内部存储,主要是设备的内存
——External Storage:外部存储,主要是存储卡
——Network Connection:存储于网络上的某服务器上
——Shared Preferences:以xml形式存储
——SQLite Databases:以SQLite数据库形式存储
——ContentProvider:解决应用程序之间的数据通信、共享的问题

——File
1)Java提供了一套完整的IO流体系,包括FileInputStream,FileOutputStream等,Android同样支持以这种方式来访问手机存储器上的文件。
Context提供了如下两个方法来打开本应用程序的数据文件夹的IO流:
context.openFileInput(filename):打开应用程序的数据文件夹下的filename文件对应的输入流
context.openFileOutput(filename,mode):打开应用程序的数据文件夹下的filename文件对应的输出流
注意:该模式支持如下值
MODE_PRIVATE:该文件只能被当前程序读写
MODE_APPEND:以追加的方式打开该文件
MODE_WORLD_READABLE:该文件的内容可以被其他程序读取
MODE_WORLD_WRITEABLE:该文件的被人可由其他程序读写。
MODE_MULTI_PROCESS:设置多线程安全
此外Context提供了如下几个方法来访问应用程序的数据文件夹
getDir(String name,int mode):获取或创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹的绝对路径

        String[] fileList():返回该应用程序的数据文件夹的全部文件
 deleteFile(String):删除该应用程序的数据文件夹下的指定文件

2)存放文件的路径:/data/data/package name/files/
3)读取SD卡上的文件
   当程序通过openFileInput获取openFileOutput来打开文件输入流,输出流时。程序所打开的都是应用程序的数据文件夹里的文件,这样所存储的文件大小可能比较有限(毕竟手机内置的存储空间有限)。为了更好地存,取应用程序的大文件数据,应用程序需要读写SD卡上的文件。SD卡大大扩充手机的存储能力。
   读写SD上的文件的步骤:

a)调用Environment的getExternalStorageState()方法判断手机是否插入SD卡。
并且应用程序具有读写SD卡的权限。如果如下代码返回true就满足条件
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
b)调用Environment的getExternalStorageDirectory()方法来获取外部存储器的目录
c)使用FileInputStream,FileOuputStream,FileReader,FileWriter读写SD卡里的文件。
注意:1)手机上应该已插入SD卡,对于模拟器,可通过mksdcard命令创建虚拟存储卡。
2)为了读写SD卡的数据,需要添加权限
MOUNT_UNMOUNT_FILESYSTEMS:创建和删除文件权限
WRITE_EXTERNAL_STORAGE:写入数据权限

package com.xspacing.filetest;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

/**
 * 
 * @ClassName MainActivity.java
 * @Description File读取文件
 * @author smile
 * @version v1.0
 * @date 2016年10月17日
 */
public class MainActivity extends Activity {

    private TextView mTvRead;
    private EditText mEtWriteName;
    private EditText mEtWriteContent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        mTvRead = (TextView) findViewById(R.id.read_tv);
        mEtWriteName = (EditText) findViewById(R.id.et_name);
        mEtWriteContent = (EditText) findViewById(R.id.et_write);
    }

    /**
     * 写入本地
     * 
     * @param v
     */
    public void write(View v) {
        String name = mEtWriteName.getText().toString();
        String content = mEtWriteContent.getText().toString();
        FileOutputStream fio = null;
        try {
            fio = this.openFileOutput(MD5Encoder.encode(name), Context.MODE_PRIVATE);
            fio.write(content.getBytes("utf-8"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fio.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 读取本地
     * 
     * @param v
     */
    public void read(View v) {
        String name = mEtWriteName.getText().toString();
        FileInputStream fis = null;
        try {
            fis = this.openFileInput(MD5Encoder.encode(name));
            BufferedInputStream buffer = new BufferedInputStream(fis);
            int len = 0;
            byte[] b = new byte[1024];
            StringBuffer stringBuffer = new StringBuffer();
            while ((len = buffer.read(b)) != -1) {
                stringBuffer.append(new String(b, 0, len));
            }
            mTvRead.setText(stringBuffer);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * 写入sdcard
     * 
     * @param v
     */
    public void writeSd(View v) {
        // sdcard是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String name = mEtWriteName.getText().toString();
            String content = mEtWriteContent.getText().toString();
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + name;
            // 创建文件夹
            File dir = new File(path);
            // 如果dir不存在,或者不是文件夹
            if (!dir.exists() || !dir.isDirectory()) {
                dir.mkdir();
            }
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(new File(dir, MD5Encoder.encode(name)));
                fos.write(content.getBytes("utf-8"));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } else {
            return;
        }
    }

    /**
     * 读取sdcard
     * 
     * @param v
     */
    public void readSd(View v) {
        // sdcard是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String name = mEtWriteName.getText().toString();
            // 本地路径
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + name;
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(new File(path, MD5Encoder.encode(name)));
                BufferedInputStream buffer = new BufferedInputStream(fis);
                int len = 0;
                byte[] b = new byte[1024];
                StringBuffer stringBuffer = new StringBuffer();
                while ((len = buffer.read(b)) != -1) {
                    stringBuffer.append(new String(b, 0, len));
                }
                mTvRead.setText(stringBuffer);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } else {
            return;
        }
    }

}
<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"
    tools:context="com.xspacing.filetest.MainActivity" >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="文件名" />

    <EditText
        android:id="@+id/et_write"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="文件内容" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="write"
        android:text="写入本地" />

    <TextView
        android:id="@+id/read_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="read"
        android:text="读取本地" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="writeSd"
        android:text="写入sdcard" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="readSd"
        android:text="读取sdcard" />

LinearLayout>

AndroidManifest.xml

 
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

你可能感兴趣的:(android)