zoukankan      html  css  js  c++  java
  • android SD卡文件的读写

    SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件 Android模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件 为了读\写SD卡上的文件,必须在AndroidManifest.xml中添加读\写SD卡的权限 在SD卡上创建与删除文件的权限        Android.permission.MOUNT_UNMOUNT_FIFESYSTEMS 向SD卡写入数据的权限         Android.permission.WRITE_EXTERNAL_STORAGE

    编程访问SD卡方法一 首先需要检测系统的/mnt/sdcard目录是否可用 使用文件的输入输出流对SD卡里的文件进行读写 编程访问SD卡方法二 调用Environment的getExternalStorageState()方法判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限  Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的根目录 使用文件的输入输出流对SD卡里的文件进行读写.

    核心代码

    写入文件到sd卡 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState()  .equals(Environment.MEDIA_MOUNTED)) {  //获取SD卡的目录  File sdCardDir = Environment.getExternalStorageDirectory();  File targetFile = new File(sdCardDir.getCanonicalPath()+ FILE_NAME);  //以指定文件创建          RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式  RandomAccessFile raf = new RandomAccessFile(targetFile , "rw");  //将文件记录指针移动到最后  raf.seek(targetFile.length());  // 输出文件内容  raf.write(content.getBytes());  raf.close(); }

    读取sd卡的文件 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState()  .equals(Environment.MEDIA_MOUNTED))  {  //获取SD卡对应的存储目录  File sdCardDir = Environment.getExternalStorageDirectory();  //获取指定文件对应的输入流  FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + FILE_NAME);  //将指定输入流包装成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();   }

    注意,还要加权限 <!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    下面列举一个实例,主要是按下写入按钮后把EditText的内容写入到sd卡里,然后按下读取按钮后就可以把sd卡里的文件读出来

    第一步是编写main.xml文件

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:orientation="vertical"  4     android:layout_width="fill_parent"  5     android:layout_height="fill_parent">  6 <EditText android:id="@+id/edit1"  7     android:layout_width="fill_parent"  8     android:layout_height="wrap_content"  9     android:lines="4"/> 10 <Button android:id="@+id/write" 11     android:layout_width="wrap_content" 12     android:layout_height="wrap_content"  13     android:text="@string/write"/> 14 <EditText android:id="@+id/edit2" 15     android:layout_width="fill_parent" 16     android:layout_height="wrap_content" 17     android:editable="false" 18     android:cursorVisible="false" 19     android:lines="4"/>         20 <Button android:id="@+id/read" 21     android:layout_width="wrap_content" 22     android:layout_height="wrap_content"  23     android:text="@string/read"/> 24 </LinearLayout>
    复制代码

    第二步:写入核心代码:

    复制代码
      1 package cn.edu.zwu.tel;   2    3 import java.io.BufferedReader;   4 import java.io.File;   5 import java.io.FileInputStream;   6 import java.io.InputStreamReader;   7 import java.io.RandomAccessFile;   8 import android.app.Activity;   9 import android.os.Bundle;  10 import android.os.Environment;  11 import android.view.View;  12 import android.view.View.OnClickListener;  13 import android.widget.Button;  14 import android.widget.EditText;  15 import android.os.Bundle;  16   17 public class FileSDsaveTest02Activity  extends Activity  18 {  19     final String FILE_NAME = "/FileSDTest.ini";  20   21     @Override  22     public void onCreate(Bundle savedInstanceState)  23     {  24         super.onCreate(savedInstanceState);  25         setContentView(R.layout.main);  26         // 获取两个按钮 27         Button read = (Button) findViewById(R.id.read);  28         Button write = (Button) findViewById(R.id.write);  29         // 获取两个文本框 30         final EditText edit1 = (EditText) findViewById(R.id.edit1);  31         final EditText edit2 = (EditText) findViewById(R.id.edit2);  32         // 为write按钮绑定事件监听器 33         write.setOnClickListener(new OnClickListener()  34         {  35             @Override  36             public void onClick(View source)  37             {  38                 // 将edit1中的内容写入文件中 39                 write(edit1.getText().toString());  40                 edit1.setText("");  41             }  42         });  43   44         read.setOnClickListener(new OnClickListener()  45         {  46             @Override  47             public void onClick(View v)  48             {  49                 // 读取指定文件中的内容,并显示出来 50                 edit2.setText(read());  51             }  52         });  53     }  54   55     private String read()  56     {  57         try  58         {  59             //如果手机插入了SD卡,而且应用程序具有访问SD的权限 60             if (Environment.getExternalStorageState()  61                 .equals(Environment.MEDIA_MOUNTED))  62             {  63                 //获取SD卡对应的存储目录 64                 File sdCardDir = Environment.getExternalStorageDirectory();  65                 //获取指定文件对应的输入流 66                 FileInputStream fis = new FileInputStream(sdCardDir  67                     .getCanonicalPath()    + FILE_NAME);  68                 //将指定输入流包装成BufferedReader 69                 BufferedReader br = new BufferedReader(new   70                     InputStreamReader(fis));  71                 StringBuilder sb = new StringBuilder("");  72                 String line = null;  73                 while((line = br.readLine()) != null)  74                 {  75                     sb.append(line);  76                 }  77                 return sb.toString();  78             }  79         }  80         catch (Exception e)  81         {  82             e.printStackTrace();  83         }  84         return null;  85     }  86   87     private void write(String content)  88     {  89         try  90         {      91             //如果手机插入了SD卡,而且应用程序具有访问SD的权限 92             if (Environment.getExternalStorageState()  93                 .equals(Environment.MEDIA_MOUNTED))  94             {  95                 //获取SD卡的目录 96                 File sdCardDir = Environment.getExternalStorageDirectory();  97                 File targetFile = new File(sdCardDir.getCanonicalPath()  98                     + FILE_NAME);  99                 //以指定文件创建    RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式100                 RandomAccessFile raf = new RandomAccessFile( 101                     targetFile , "rw"); 102                 //将文件记录指针移动到最后103                 raf.seek(targetFile.length()); 104                 // 输出文件内容105                 raf.write(content.getBytes()); 106                 raf.close(); 107             } 108         } 109         catch (Exception e) 110         { 111             e.printStackTrace(); 112         } 113     } 114 }
    复制代码

    第三步:修改AndroidMainFest文件,主要是加入权限

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>  2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  3     package="cn.edu.zwu.tel"  4     android:versionCode="1"  5     android:versionName="1.0" >  6   7     <uses-sdk android:minSdkVersion="8" />  8   9     <application 10         android:icon="@drawable/ic_launcher" 11         android:label="@string/app_name" > 12         <activity 13             android:name=".FileSDsaveTest02Activity" 14             android:label="@string/app_name" > 15             <intent-filter> 16                 <action android:name="android.intent.action.MAIN" /> 17  18                 <category android:name="android.intent.category.LAUNCHER" /> 19             </intent-filter> 20         </activity> 21     </application> 22    <!-- 在SD卡中创建与删除文件权限 --> 23     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 24     <!-- 向SD卡写入数据权限 --> 25     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 26 </manifest>
    复制代码

    效果图:

  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/fx2008/p/3137977.html
Copyright © 2011-2022 走看看