Android 读写SD卡的文件

要读写SD卡上的文件,首先需要判断是否存在SD卡:

    Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

然后才能读写SD卡上的文件,调用Environment的getExternalStorageDirectory()方法获取外部存储器(SD卡)的目录。 使用FileInputStream、FileOutputStream、FileReader或FileWriter读、写SD卡里的文件。

需要注意是要添加相应的权限。

读文件的代码:

private String read(){        try {            //如果手机插入了SD卡,而且应用程序具有访问SD的权限            if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) {                //获取SD卡对应的存储目录                File sdCardDir = Environment.getExternalStorageDirectory();                //获取指定文件对应的输入流                FileInputStream fis = new FileInputStream(sdCardDir                    .getCanonicalPath()    + FILE_NAME);                //将指定输入流包装成BufferedReader                BufferedReader br = new BufferedReader(new                    InputStreamReader(fis));                StringBuilder sb = new StringBuilder("");                String line = null;                while((line = br.readLine()) != null){                    sb.append(line);                }                return sb.toString();            }        }        catch (Exception e)        {            e.printStackTrace();        }        return null;    }

使用RandomAccessFile向SD卡指定文件追加数据

    private void write(String content) {        try {                //如果手机插入了SD卡,而且应用程序具有访问SD的权限            if (Environment.getExternalStorageState()                .equals(Environment.MEDIA_MOUNTED))            {                //获取SD卡的目录                File sdCardDir = Environment.getExternalStorageDirectory();                File targetFile = new File(sdCardDir.getCanonicalPath()                    + FILE_NAME);                //以指定文件创建    RandomAccessFile对象                RandomAccessFile raf = new RandomAccessFile(                    targetFile , "rw");                //将文件记录指针移动到最后                raf.seek(targetFile.length());                // 输出文件内容                raf.write(content.getBytes());                raf.close();            }        }        catch (Exception e)        {            e.printStackTrace();        }    }

FileOutputStream会把原来的数据清空,然后重新写入数据

private void write(String content){    try {            //如果手机插入了SD卡,而且应用程序具有访问SD的权限        if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED))  {                     FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory());                OutputStreamWriter osw = new OutputStreamWriter(fos);                BufferedWriter bw = new BufferedWriter(osw);                bw.write(content); // content为你需要写入的字符串                bw.close();            }    }    catch (Exception e) {        e.printStackTrace();    }}

实例:SD卡文件浏览器

布局文件:

layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>            

layout/line.xml

<?xml version="1.0" encoding="utf-8"?>        

MainActivity

import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity {    private ListView mListView;    private TextView mTextView;    //记录当前的父文件夹    private File mCurrentParent;    //记录当前路径下的所有文件的文件数组    File[] mCurrentFiles;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.list);        mTextView = (TextView) findViewById(R.id.path);        //获取系统的SD卡的目录        File root = new File(String.valueOf(Environment.getExternalStorageDirectory()));        //如果SD卡存在        if (root.exists()) {            mCurrentParent = root;            mCurrentFiles = root.listFiles();            //使用当前目录下的全部文件、文件夹来填充ListView            inflateListView(mCurrentFiles);        }        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                if (mCurrentFiles[position].isFile()) {                    return;                }                File[] tmp = mCurrentFiles[position].listFiles();                if (tmp == null || tmp.length == 0) {                    Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件", Toast.LENGTH_SHORT).show();                } else {                    mCurrentParent = mCurrentFiles[position];                    mCurrentFiles = tmp;                    inflateListView(mCurrentFiles);                }            }        });        //获取上一级目录的按钮        Button parent = (Button) findViewById(R.id.parent);        parent.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try {                    if (!mCurrentParent.getCanonicalFile().equals("/mnt/shell/emulated/0")) {                        mCurrentParent = mCurrentParent.getParentFile();                        mCurrentFiles = mCurrentParent.listFiles();                        inflateListView(mCurrentFiles);                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }    private void inflateListView(File[] files) {        //创建一个List集合,List集合的元素是Map        List> listItems = new ArrayList<>();        for (int i = 0; i < files.length; i++) {            Map listItem = new HashMap<>();            if (files[i].isDirectory()) {                listItem.put("icon", R.drawable.folder);            } else {                listItem.put("icon", R.drawable.file);            }            listItem.put("fileName", files[i].getName());            listItems.add(listItem);        }        //创建一个SimpleAdapter        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line, new String[]{"icon", "fileName"}, new int[]{R.id.icon, R.id.file_name});        mListView.setAdapter(simpleAdapter);        try {            mTextView.setText("当前路径为:" + mCurrentParent.getCanonicalPath());        } catch (IOException e) {            e.printStackTrace();        }    }}

更多相关文章

  1. 把android db文件导入到项目中
  2. EditTextView:取消焦点&自动获取焦点
  3. Android(安卓)权限大全中英对照
  4. TransitionDrawable的简单替换图片
  5. Android(安卓)SeLinux权限问题和解决方法
  6. default.properties导致不能点Android选项问题
  7. Android简单的利用MediaRecorder进行录音
  8. android 读取本地图片生成 bitmap
  9. Ubuntu 下更新adt 的问题

随机推荐

  1. Android弹出窗口的实现(PopupWindow)
  2. Android禁止按键关闭AlertDialog
  3. iPhone 7销量超华为OPPO!iOS中国份额狂涨
  4. Android 快速简单实现夜间模式
  5. android屏幕信息获取的两种方法
  6. Android类参考---Fragment(三)
  7. Android 代码模拟输入按键
  8. 开源Jamendo在线音乐播放器源码(二)
  9. Android设置RadioButton在文字的右边
  10. arcgis android sdk load local tile