標籤:
我們要實現的是:往輸入框輸入資料,點擊一個寫入按鈕,將輸入框內的資料寫入到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 @Override21 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 @Override61 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"/>
手機的sd卡的寫入和讀取資料的方