• 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文件

    View Code
     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>

    第二步:写入核心代码:

    View Code
      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文件,主要是加入权限

    View Code
     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>

    效果图:




  • 相关阅读:
    JS中的if语句内如何加or使多个条件通过
    对计算属性中get和set的理解
    如何在vue里实现同步阻塞请求,请求完成之前不加载页面或组件?
    vue 路由传参 params 与 query两种方式的区别
    vue中通过路由跳转的三种方式
    vue生成单文件组件和组件嵌套步骤
    this.$router.push() 在新窗口怎么打开
    Vue路由获取路由参数
    vue的v-for循环普通数组、对象数组、对象、数字
    element el-cascader设置默认值
  • 原文地址:https://www.cnblogs.com/shaoyangjiang/p/2388178.html
Copyright © 2020-2023  润新知