随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

通过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向指定文件写入数据,会把原有的文件内容清空。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐