Android在代码中如何使用SD卡
创始人
2024-07-30 12:51:24
0

1 SD 是否可用检查

有两种方式,一种是写一个监听函数,用来监听

  1. private final BroadcastReceiver broadcastRec = new BroadcastReceiver() {  
  2. @Override  
  3. public void onReceive(Context context, Intent intent) {  
  4. if (intent.getAction().equals("android.intent.action.MEDIA_MOUNTED")) { //SD 卡已经成功挂载  
  5. //有SD 卡  
  6. } else if (intent.getAction().equals("android.intent.action.MEDIA_REMOVED")  
  7. ||  
  8. intent.getAction().equals("android.intent.action.ACTION_MEDIA_UNMOUNTED")  
  9. ||  
  10. intent.getAction().equals("android.intent.action.ACTION_MEDIA_BAD_REMOVAL")) {//各种未挂载状态  
  11. //无SD 卡  
  12.    }  
  13.  }  
  14. }; 

另一种在我看来,更简单一些:

  1. File f = new File("/sdcard/");  
  2. f.exists(); 

2 卡上数据的读写

在动手之前,我们先来看看,要对SD 卡进行读写操作,Android 为我们准备了哪些类/接口。

接口:FileFilter

:File、FileInputStream、FileOutputStream

下面我们依次对上面出场的做个简单的介绍吧,同时,也会给出若干代码来说明各个类如何使用

3 File

文件系统的一个抽象描述类,可以使用相对路径和绝对路径,该类提供了若干方法查询/修改文件信息

  1. File file = new File("/sdcard/a.txt"); 

判断文件是否存在:

  1. file.exists() 

“文件”是目录还是文件

  1. file.isDirectory() 

如果文件为目录,如何列出子目录呢?

  1. File[ ] filefiles = file.listFiles(); 

对于文件,如果获得文件的一些信息

  1. file.length(); //文件的长度  
  2. file.canRead(); //文件可以读吗  
  3. file.canWrite(); //文件可以写吗  
  4. file.delete(); //删除该文件 

下面,给出一些片断代码来展示如何使用File 类

  1. //创建一个新文件  
  2. File file = new File("/sdcard/a.txt");  
  3. if (!file.exists()) {  
  4. try {  
  5. file.createNewFile();  
  6. } catch (IOException e) {  
  7. e.printStackTrace();  
  8. } }  
  9. //创建一个新文件夹  
  10. File file = new File("/sdcard/a/b/c");  
  11. if (!file.exists()) {  
  12. try {  
  13. file.mkdirs();  

请注意,mkdirs()和mkdir()的用法,mkdirs()表示,如果需要,会先创建上层目录,如上述代码中,如果SD 卡根目录不存在目录a,那么,使用mkdir()会抛出异常。

#p#

4 FileFilter

我们知道,listFiles()会列出当前目录下的文件,但是,另一个问题出来了,如果当前目录下文件杂乱无部分,而我们又不想列出所有文件,怎么办?FileFilter 提供了一个解决方法。我们只需要实现public abstract boolean accept(File pathname)接口就可以了。

  1. FileFilter filter = new FileFilter() {  
  2. public boolean accept (File file) {  
  3. if (file.isFile() && file.getAbsolutePath().toLowerCase().endsWith(".txt")) {  
  4. return true;  
  5. }  
  6. return false;  
  7. }  
  8. };  
  9. File[] filefiles = file.listFiles(filter); 

以上代码展示了如何只列出当前目录下的TXT 文件。

5 FileInputStream

我们不仅需要对文件进行操作,还需要对文件的内容进行操作,这时候,FileInputStream 就登场了

FileInputStream 继承自InputStream,但是FileInputStream 使用了缓冲,以提高频繁读入数据时的性能。

使用FileInputStream 也很简单

  1. FileInputStream fis = new FileInputStream("/sdcard/a.txt");  
  2. byte[ ] abytes = new byte[1024]  
  3. int len = fis.read(abytes); 

在上述代码中,我们打开了SD 卡根目录下的a.txt 文件,同时,读入1K 的数据,需要注意的是,read 并不能保
证一定读入期望长度的数据,我们需要对读入数据的长度进行检查。

6 FileOutputStream

  1. FileOutputStream 与OutputStream 的用法差不多,在些也不多说,给出一个代码吧:  
  2. FileOutputStream fos = new FileOutputStream("/sdcard/a.txt");  
  3. fos.write("Hello World!".getBytes());  
  4. fos.flush(); 

上述代码会向a.txt 中写入Hello World 字符,请注意,FileOutputStream 也使用了缓冲,因此,数据不会立即写入文件中,当系统认为需要写回数据的时候,真正的写回才发生,因此,如果为了让数据立即写回,需要使用flush()方法。

也许你会问到,我不想把文件原有的内容抹到,怎么?这个也简单,

  1. FileOutputStream fos = new FileOutputStream("/sdcard/a.txt", true); 

true 表示向文件后面追加数据

【编辑推荐】

Android模拟器使用SD卡

你如何正确启动Android SDK 1.5模拟器

安装Android SDK 2.0及创建2.0模拟器的方法

把Android源代码加入SDK,就可以按F3查看类了

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...