Android存储(四):读写SD卡的文件
16lz
2021-01-26
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
更多相关文章
- 把android db文件导入到项目中
- EditTextView:取消焦点&自动获取焦点
- Android(安卓)权限大全中英对照
- TransitionDrawable的简单替换图片
- Android(安卓)SeLinux权限问题和解决方法
- default.properties导致不能点Android选项问题
- Android简单的利用MediaRecorder进行录音
- android 读取本地图片生成 bitmap
- Ubuntu 下更新adt 的问题