手机的sd卡的写入和读取数据的方

我们要实现的是:往输入框输入数据,点击一个写入按钮,将输入框内的数据写入到sd卡上,在点击读取按钮,则将sd卡上只等的文件名称内的数据显示到一个textView上。

首先,看一下XML文件,很简单,只有两个按钮,一个输入框,和一个文本控件;

保存的数据可以到mnt/sdcard/下查看

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="59dp"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="46dp"
        android:text="写入" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignRight="@+id/editText1"
        android:text="读取" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button2"
        android:layout_marginBottom="14dp"
        android:layout_toRightOf="@+id/button1"
        android:text="TextView" />

</RelativeLayout>

  然后是自己新建的一个功能类FileService,主要负责往sd卡上读取和写入数据。

package com.example.sdcord;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.os.Environment;

/**
 * 主要用于往sd卡上读取和写入数据
 *
 * @author Administrator
 *
 */
public class FileService {

	private Context context;

	public FileService(Context context) {
		this.context = context;
	}

	/**
	 * 写入数据
	 *
	 * @param fileName
	 *            文件名称
	 * @param context
	 *            文件内容
	 * @return 返回值是false则写入数据失败,反之则成功
	 */
	public boolean saveFile(String fileName, String context) {
		boolean flag = false;
		FileOutputStream fileOutputStream = null;
		// getExternalStorageDirectory():返回扩展存储卡的目录
		File file = new File(Environment.getExternalStorageDirectory(),
				fileName);
		// getExternalStorageState():返回扩展存储卡的当前状态,调用此方法,将会
		// 返回一个String类型状态值,如果返回的状态和Environment.MEDIA_MOUNTED(已经挂载并且拥有可读可写权限)
		//的值一样的话,说明当前的sd卡可以进行操作
		if (Environment.MEDIA_MOUNTED.equals(Environment
				.getExternalStorageState())) {
			try {
				fileOutputStream = new FileOutputStream(file);
				fileOutputStream.write(context.getBytes());
				flag = true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (fileOutputStream != null) {
				}
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return flag;
	}

	/**
	 *
	 * @param fileName 文件名稱
	 * @return			以字符串表現形式返回讀取到的數據
	 */
	public String getFile(String fileName) {
		FileInputStream fileInputStream = null;
		//缓冲的流,与磁盘无关,所以不需要关闭
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		File file = new File(Environment.getExternalStorageDirectory(),
				fileName);
		//判断sd卡是否可用
		if (Environment.MEDIA_MOUNTED.equals(Environment
				.getExternalStorageState())) {
			try {
				fileInputStream = new FileInputStream(file);
				int len = 0;
				byte[] data = new byte[1024];
				while ((len = fileInputStream.read(data)) != -1) {
					output.write(data, 0, len);
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (fileInputStream != null) {
					try {
						fileInputStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}

		}

		return new String(output.toByteArray());

	}
}

  接着是activity类,

 1 package com.example.sdcord;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.text.Editable;
 6 import android.view.Menu;
 7 import android.view.View;
 8 import android.view.View.OnClickListener;
 9 import android.widget.Button;
10 import android.widget.EditText;
11 import android.widget.TextView;
12
13 public class MainActivity extends Activity implements OnClickListener{
14
15     private Button btn1;
16     private Button btn2;
17     private TextView textView;
18     private EditText editText;
19
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24
25         btn1 = (Button) findViewById(R.id.button1);
26         btn2 = (Button) findViewById(R.id.button2);
27         textView = (TextView) findViewById(R.id.textView1);
28         editText = (EditText) findViewById(R.id.editText1);
29
30         btn1.setOnClickListener(this);
31         btn2.setOnClickListener(this);
32
33     }
34
35     public void onClick(View view){
36         switch(view.getId()){
37         case R.id.button1:
38             String data1 = editText.getText().toString();
39             savaFile("test.txt",data1);
40             break;
41         case R.id.button2:
42             String data2 = readFile("test.txt");
43             textView.setText(data2);
44             break;
45         }
46     }
47
48     public void savaFile(String dir,String data){
49         FileService fileService = new FileService(this);
50         fileService.saveFile(dir,data);
51     }
52
53     public String readFile(String fileName){
54         FileService fileService = new FileService(this);
55         String data = fileService.getFile(fileName);
56         return data;
57     }
58
59
60     @Override
61     public boolean onCreateOptionsMenu(Menu menu) {
62         // Inflate the menu; this adds items to the action bar if it is present.
63         getMenuInflater().inflate(R.menu.main, menu);
64         return true;
65     }
66
67 }

最后,注意,因为我们的操作涉及到了sd卡的写入和读取权限,所以要在manifest文件中添加相应的授权信息

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

时间: 2024-10-03 21:02:47

手机的sd卡的写入和读取数据的方的相关文章

Android文件存储往SD卡中写入文件路径出错问题求解。

============问题描述============   因为学习需要  看的老罗的视频  关于数据存储往SD卡写文件的那一部分  几乎完全照办的敲的代码   结果在pad上测试的时候和预想的有区别     本来应该存储到SD卡中的文件结果跑到pad自带内存中去了...   然后我尝试过把路径直接自己手动写  还是一样存到了自带内存中  这到底是为什么啊? 顺带吐槽一下万恶的导师  十一还要我们加班 求大神们指导呀~   国庆节玩的开学哟!!! ============解决方案1======

android 往sd卡中写入文件

在调用前需要判断是否有写入权限 Environment类提供了比较丰富的方法 static File getDataDirectory() 获得android data的目录. static File getDownloadCacheDirectory() 获得下载缓存目录. static File getExternalStorageDirectory() 或者外部存储媒体目录. static File getExternalStoragePublicDirectory(String type

Android手机外置SD卡(TF卡)的获取方法

Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G.32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此时这张卡仍处于手机的扩展部分.后来,随着手机的发展以及存储能力的增加,这张外置SD卡,逐渐成为了手机的一部分,不再允许可挺拔了,当然现在依然有的手机允许对存储进行拓展,比如三星等. 那张拓展的存储卡,现在叫做TF卡,且不是所有的手机都支持它,但是有时候有些奇葩需求偏要优先存储在TF卡里面,这叫不得不

Android下获取手机和SD卡的总空间和可用空间

获取SD卡的总空间和可用空间 File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); long availableBlocks = stat.getAvailableBlocks(); long tota

Java笔记--java一行一行写入或读取数据

转自 Ruthless java一行一行写入或读取数据 链接:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/phsftp/evdokey目录下有个evdokey_201103221556.txt文件, 现在对evdokey_201103221556.txt文件进行写入或读取操作,并解决写入或读取出现的乱码问题. 文件内容如: zhangsan,23,福建 lisi,30,上海 wangwu,43,北京 l

apk安装 手机没sd卡安装失败解决方案

今天在发布1.5.4版本的时候 测试下自动化更新的时候遇到了公司一个同事三星手机安装失败,请看截图 在eclipse下报错信息如下: 所以百度随便搜下都能找到解决方案 INSTALL_FAILED_MEDIA_UNAVAILABLE,这个问题的原因为Android应用安装位置当前不可用.而Android应用安装位置有手机rom内和sdcard两种.由于Android设备没有sdcard便有可能出现INSTALL_FAILED_MEDIA_UNAVAILABLE. 解决办法有两种: 1.Andro

安卓手机内外SD卡互换

相信有許多人....有內置sd太小...外置sd(sdcard2或extsd)卻只能放資料.... 一些遊戲或者是影音播放軟體....根本不會去讀外置sd(sdcard2或extsd)..... 記憶卡買多大都沒啥用.....非常困擾..... 終於...給我找到修改路徑的方法.......注意....android4.0以上適用....4.0以下的話路徑不太一樣!! 1.android4.0版本適用 2.需root 3.使用ES文件瀏覽器,找到system/etc/vold.fstab這個文件

java一行一行写入或读取数据

        假如E:/phsftp/evdokey目录下有个evdokey_201103221556.txt文件, 现在对evdokey_201103221556.txt文件进行写入或读取操作,并解决写入或读取出现的乱码问题. /**     * 一行一行读取文件,适合字符读取,若读取中文字符时会出现乱码     *      * 流的关闭顺序:先打开的后关,后打开的先关,     *       否则有可能出现java.io.IOException: Stream closed异常    

第十七章,txt文件的写入和读取数据结合练习(C++)

#include <iostream> #include <fstream> int main(int argc, char** argv) { std::string str; //--------1.向文件中写入数据-------- std::cout<<"请输入您希望输入的数据,按"回车"键结束."<<std::endl; std::cin>>str; //没有这个文件,会自动创建 std::ofst