Android开发——通过SD卡外部存储数据

  当程序通过openFileInput获取openFileOutput来打开文件输入流,输出流时,为了更还得存取应用程序的大文件数据,应用程序需要读写SD卡上的文件。SD卡大大的扩充了手机的储存能力,不过随着大内存手机的普及,现在市场上的手机很多已经没有配置SD卡功能了。

  布局文件还是和前面那个一样:

封装好一个toast

package com.example.datasave.Utils;

import android.content.Context;
import android.widget.Toast;

/**
 * @author Squid
 *
 */
public class ToastUtil {

	/**
	 * 显示的Toast内容
	 * @param context:上下文环境
	 * @param text:需要显示的内容
	 */
	public static void showToast(Context context,String text){
		Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
	}
}

给程序SD卡相关权限

<!-- 在SD卡中删除或者创建文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 允许对SD卡文件进行读写操作-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.datasave.MainActivity" >

    <EditText
        android:id="@+id/main_et_writedata"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请写入数据" />
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="写入"
        android:onClick="write"/>
     
     <EditText
        android:id="@+id/main_et_readdata"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请读取数据" />
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取"
        android:onClick="read"/>
</LinearLayout>

MainActivity.java

package com.example.datasave3;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

import com.example.datasave.Utils.ToastUtil;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
/**
 * @author Squid
 *从SD卡上读写数据
 */
public class MainActivity extends Activity {
	private final String FILE_NAME = "squid3.txt";// 文件名
	private EditText mEt_writeData, mEt_readData;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mEt_writeData = (EditText) findViewById(R.id.main_et_writedata);
		mEt_readData = (EditText) findViewById(R.id.main_et_readdata);
	}

	// 写入按钮的监听
	public void write(View view) {
		String content=mEt_writeData.getText().toString();
		//判断当前系统是否有SD卡,并且具有读取SD卡权限
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			//获取SD卡目录
			File sdDir=Environment.getExternalStorageDirectory();
			//获取写入的文件
			File targetFile=new File(sdDir.getAbsolutePath()+"/"+FILE_NAME);
			//String targetFile=sdDir.getAbsolutePath()+"/"+FILE_NAME;
			try {
				//输出内容到SD卡指定目录下
				//FileOutputStream fos=new FileOutputStream(sdDir+"/"+FILE_NAME);
				RandomAccessFile raf=new RandomAccessFile(targetFile, "rw");
				//查询文件长度,方便下一次读写
				raf.seek(targetFile.length());
				//写入内容
				raf.write(content.getBytes());
				//关闭流
				raf.close();
				ToastUtil.showToast(this, "写入成功");
				mEt_writeData.setText("");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				ToastUtil.showToast(this, "写入失败");
			}
		}else{
			ToastUtil.showToast(this, "内存卡不存在");
		}
	}

	// 读取按钮的监听
	public void read(View view) {
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			File sdDir=Environment.getExternalStorageDirectory();
			String targetFile=sdDir.getAbsolutePath()+"/"+FILE_NAME;
			try {
				FileInputStream fis=new FileInputStream(targetFile);
				//字符流
				BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(fis));
				String line=null;
				StringBuffer sb=new StringBuffer();
				while((line=bufferedReader.readLine())!=null){
					sb.append(line);
				}
				bufferedReader.close();
				mEt_readData.setText(sb.toString());
				ToastUtil.showToast(this, "读取成功");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				ToastUtil.showToast(this, "读取失败");
			}
			
		}else{
			ToastUtil.showToast(this, "内存卡不存在");
		}
	}
}
今天博主在学习的时候碰到了一个问题,之前博主不是说过了因为系统和虚拟机的问题导致了博主只能用自带的虚拟机和真机吗?学习这个的时候博主就很悲剧:

内存卡不存在
没有内存卡!不过博主还是解决了,当时就写了篇 博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游语

对你有帮助,可以请我喝杯奶哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值