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. java中InputStream中的抽象方法read()为什
  2. 有没有做过java的jsp页面调用海康视频的s
  3. Java多线程聊天对话框
  4. 1.4.Java循环结构和break,random()
  5. Java 集合类实现原理
  6. 使用JNI的步骤
  7. javascript实现拖动层效果代码(许愿墙)
  8. 数字金额转换成汉字
  9. java关键字个人理解
  10. 我无法让这个简单的ajax代码工作