通过Context的openFileInput或openFileOutput来打开文件输入流、输出流时,程序所打开的都是应用程序的数据文件夹里的文件,这样文件大小很有限。为了更好地存取应用程序的大文件数据,需要读写SD卡上的文件。
读写SD卡上的文件的步骤:
1、调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且具有读写权限。
2、调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录。
3、使用FileInputStream、FileOutputStream、FileReader或FileWriter读、写SD卡里的文件。
下面通过一个简单实例来演示:
Activity:
package com.lovo.sdcardtest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { private EditText edit1; private EditText edit2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取两个按钮 Button readBtn = (Button) findViewById(R.id.main_btn_read); Button writeBtn = (Button) findViewById(R.id.main_btn_write); // 获取两个文本框 edit1 = (EditText) findViewById(R.id.main_et1); edit2 = (EditText) findViewById(R.id.main_et2); writeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 将edit1中的内容写入文件中 write(edit1.getText().toString()); edit1.setText(""); } }); readBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 读取指定文件中的内容并显示到edit2中 edit2.setText(read()); } }); } private String read() { try { // 如果手机插入了SD卡,而且应用程序具有访问SD卡的权限 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取SD卡对应的存储目录 File sdCardDir = Environment.getExternalStorageDirectory(); // 获取指定文件对应的输入流 FileInputStream fis = new FileInputStream( sdCardDir.getCanonicalPath() + "/hello"); // 将指定输入流包装成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; } 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() + "/hello"); // 以指定文件创建 RandomAccessFile对象 RandomAccessFile raf = new RandomAccessFile(targetFile, "rw"); // 将文件记录指针移到到最后 raf.seek(targetFile.length()); // 输出文件内容 raf.write(content.getBytes()); raf.close(); } } catch (Exception e) { e.printStackTrace(); } } }
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="输入内容:" /> <EditText android:id="@+id/main_et1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示内容:" /> <EditText android:id="@+id/main_et2" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" > <Button android:id="@+id/main_btn_write" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="写入内容" /> <Button android:id="@+id/main_btn_read" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="读取内容" /> </LinearLayout> </LinearLayout>
在配置文件中加入权限:
<!-- 在SD卡中创建于删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注:程序中使用RandomAccessFile向SD卡指定文件追加内容,如果使用FileOutputStream向指定文件写入数据,会把原有的文件内容清空。