`
QCheng5453
  • 浏览: 16563 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android笔记——Day4 *Android对SD卡的操作

 
阅读更多

前两天去苏州玩了,今天终于又可以学Android写博客了--#

 

Android对SD卡的操作

 

··Android对SD卡的操作总的来说简单的分为读文件和写文件。

··一般分为创建文件,打开文件,写入内容,读出内容,插入内容等操作。

··在创建文件时,首先要检查SD卡的状态,是可读可写,还是只读,还是不存在。

··具体的操作,我写了一个助手类,封装了一些函数,里面的注释应该写的比较清楚了。

 

package my.seu;
/*
 * 写了一个SDCardFile类,封装了许多函数功能,具体功能见每个类前面的注释
 * 有些地方可能还不够完善,调用函数时最好能加上try-catch结构。
 * 
 * 一个类对象代表一个SD卡中的文件。
 */


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

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

public class SDCardFile {

	private Context context;
	/** SD卡是否存在 **/
	private boolean hasSD = false;
	/** SD卡的路径 **/
	private String SDPATH;
//	/** 当前程序包的路径 **/
//	private String FILESPATH;
	private String wholePath;
	private String nameOfFile;
	private FileInputStream fileinputstream = null;
	private BufferedReader br = null;       //将FileInputStream和BufferedReader都设为私有成员,方便之后输出
	
	/*
	 * 下面注释掉的是网上找过来的为了获取程序包位置的构造函数,没用就注释掉了
	 */
//	public SDCardFile(Context context) {
//		this.context = context;
//		hasSD = Environment.getExternalStorageState().equals(
//				android.os.Environment.MEDIA_MOUNTED);
//		SDPATH = Environment.getExternalStorageDirectory().getPath();
//		FILESPATH = this.context.getFilesDir().getPath();
//	}
	
	
	
	/*
	 * 用文件夹名和文件名初始化SDCardFile对象,创建并将文件流赋给私有成员
	 */
	public SDCardFile(String packageName, String fileName){
		hasSD = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);			//只检验是否可读且可写
		if(hasSD){
			try{
				SDPATH = Environment.getExternalStorageDirectory().getAbsolutePath();//这里最好是获取绝对路径
	            File destDir = new File(SDPATH + "/"+packageName);
	            if (!destDir.exists()) destDir.mkdir();                 //File类可以是文件或文件夹,如果该文件夹不存在,则创建该文件夹
	            wholePath = (SDPATH + "/"+packageName+ "/" + fileName).trim(); //这句重要,防止绝对路径中存在空格,导致文件路径寻找不到,报错。
				File file = new File(wholePath);
				if (!file.exists()) {
					try{
						file.createNewFile();            //如果文件不存在,则创建该文件
					}catch (Exception e) {
						 e.printStackTrace();
					}
				}
				nameOfFile = fileName;				
			}catch (Exception e) {
				System.out.println(e);
				System.out.println("SDCard is not valid");
			
			}finally{
				try{
					fileinputstream = new FileInputStream(wholePath);
					br = new BufferedReader(new InputStreamReader(fileinputstream));//需要先将字节流转为字符流,因为BufferedReader是字符流
				}catch (Exception e) {
					e.printStackTrace();
					// TODO: handle exception
				}
			}
		}
		else{
			System.out.println("SCCard not ex");
		}
	}
	
	/*
	 * 只用文件名创建对象,默认位置为SD卡根目录,创建并将文件流赋给私有成员
	 */
	public SDCardFile(String fileName){
		hasSD = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);
		if(hasSD){
			try{
				SDPATH = Environment.getExternalStorageDirectory().getAbsolutePath();
	            wholePath = (SDPATH + "/" + fileName).trim();
				File file = new File(wholePath);
				if (!file.exists()) {
					try{
						file.createNewFile();
					}catch (Exception e) {
						 e.printStackTrace();
						// TODO: handle exception
					}
				}
				nameOfFile = fileName;				
			}catch (Exception e) {
				System.out.println(e);
				System.out.println("SDCard is not valid");
			
			}finally{
				try{
					fileinputstream = new FileInputStream(wholePath);
					br = new BufferedReader(new InputStreamReader(fileinputstream));//需要先将字节流转为字符流,因为BufferedReader是字符流
				}catch (Exception e) {
					e.printStackTrace();
					// TODO: handle exception
				}
			}
		}else{
			System.out.println("SCCard not ex");
		}
	}

	/*
	 * 获取总路径
	 */
	public String getWholePath(){
		return wholePath;
	}
	/*
	 * 获取SD卡状态
	 */
	public boolean getSDCardState(){
		return hasSD;
	}
	/*
	 * 获取文件名
	 */
	public String getFileName(){
		return nameOfFile;
	}
	

	
	/*
	 *返回一行字符串
	 */
	public String getLine(){
        String line = null;  
        try{              
            line = br.readLine();
        }catch (Exception e) {  
        	System.out.println("Cannot getline");
        }finally{
        	return line;
        }       
	}
	
	/*
	 * 读取整个文件内容
	 */
	public String readSDFile() {
		StringBuffer sb = new StringBuffer();
		File file = new File(wholePath);
		try {
			FileInputStream fis = new FileInputStream(file);
			int c;
			while ((c = fis.read()) != -1) {
				sb.append((char) c);
			}
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	
	
	/*
	 * 重写文件
	 * 这里面很多步骤省着写了,其实不是好的编程习惯...--#
	 */
	public boolean write(String content){
		try{
	        FileOutputStream outputStream = new FileOutputStream(wholePath);
	        outputStream.write(content.getBytes());
	        outputStream.close();
	        return true;
		}catch (Exception e) {
			return false;
			// TODO: handle exception
		}
	}
	
	
	/*
	 * 重载write函数,以InputStream对象为参数
	 */
	public boolean write(InputStream is){
		this.write("");
		String temp;
		try{
			FileOutputStream outputStream = new FileOutputStream(wholePath);
			byte[] b = new byte[1024];
			while(true){
				int len = is.read(b, 0, b.length);
				if(len == -1){
					break;
				}
				outputStream.write(b,0,len);
			}		
			outputStream.close();
			return true;
		}catch (Exception e) {
			return false;
			// TODO: handle exception
		}
	}
	
	
	/*
	 * 在文件末尾添加数据
	 */
	public boolean append(String content){
		try{
			FileWriter fw = new FileWriter(wholePath,true); //将第二个参数设置为true,写入数据时就是在文件末尾添加
			fw.write(content);
			fw.close();
			return true;
		}catch (Exception e) {
			return false;
			// TODO: handle exception
		}
	}

	/*
	 * 删除文件
	 */
	public boolean deleteSDFile() {
		File file = new File(wholePath);
		if (file == null || !file.exists() || file.isDirectory())
			return false;
		return file.delete();
	}

	/*
	 * 在文件末尾添加字节流
	 * 
	 *未写,感觉无必要,因为大部分需要在末尾添加的文件都是字符文件,像mp3,flv等完全没必要在文件末尾添加字节流
	 */
	
	/*
	 * 返回SD卡总的容量,单位是MB,(网上搜罗)--#
	 */
	public static long getTotalStorage() {
		  
		          // 取得SDCard当前的状态
		 String sDcString = android.os.Environment.getExternalStorageState();
		  
		          if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) {
		  
		              // 取得sdcard文件路径
		              File pathFile = android.os.Environment
		                     .getExternalStorageDirectory();
		 
		             android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());
		 
		             // 获取SDCard上BLOCK总数
		             long nTotalBlocks = statfs.getBlockCount();
		 
		             // 获取SDCard上每个block的SIZE
		             long nBlocSize = statfs.getBlockSize();
		             return  nTotalBlocks * nBlocSize / 1024 / 1024;
		          }
		          else{
		        	  return -1;
		          }
	 }
	 
	 /*
	  * 返回SD卡可用容量  --#
	  */
	public static long getUsableStorage(){
		String sDcString = android.os.Environment.getExternalStorageState();
		  
         if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) {
             File pathFile = android.os.Environment
                     .getExternalStorageDirectory();
 
             android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());
        	 
         // 获取可供程序使用的Block的数量
             long nAvailaBlock = statfs.getAvailableBlocks();

             long nBlocSize = statfs.getBlockSize();

         // 计算 SDCard 剩余大小MB
             return nAvailaBlock * nBlocSize / 1024 / 1024;
         }
         else{
        	 return -1;
         }
         
 
	 }
	
}
 

 

参考:百度文库,开源社区,新浪博客。

 

分享到:
评论

相关推荐

    Android学习笔记(十)——实现新闻列表

    【第一部分】历史文章: Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) ...Android学习笔记(七)——数据存储(共享参数Share

    Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...

    Oracle学习笔记——day05

    在Oracle学习笔记的第五天中,主要探讨了数据库中的连接查询、子查询、集合操作以及SQL注入防范等重要概念。 首先,连接查询是数据库操作的基础,用于将两个或多个表的数据结合在一起。在示例中,我们看到了三种...

    Android开发笔记——UI基础编程

    这份"Android开发笔记——UI基础编程"的资料集包含了两部分:新版Android开发教程+笔记七--基础UI编程1.pdf和新版Android开发教程+笔记七--基础UI编程2.pdf,将深入讲解Android应用程序中用户界面的设计与实现。...

    Android开发笔记——环境搭建

    这篇"Android开发笔记——环境搭建"涵盖了这一基础但至关重要的过程,旨在帮助初学者快速入门。以下将详细介绍Android开发环境的搭建步骤,以及ADB(Android Debug Bridge)的相关知识。 首先,我们需要安装Java ...

    Android开发笔记——模拟器、应用教程 pdf

    总之,这份"Android开发笔记——模拟器、应用教程"将引导你全面了解Android开发的核心技术和实践方法,无论你是初学者还是经验丰富的开发者,都可以从中受益。通过学习和掌握这些知识点,你将能够创建出高质量、适应...

    Android Training学习笔记——Navigation 参考源码

    Android Training系列是Google提供的一系列教程,旨在帮助开发者提升技能,而"Android Training学习笔记——Navigation 参考源码"则是对这一主题的深入探讨。 首先,Navigation组件的核心概念是Navigation Graph,...

    Android Training学习笔记——Navigation 参考源码(ListView版)

    这篇“Android Training学习笔记——Navigation 参考源码(ListView版)”深入探讨了如何使用Navigation构建一个基于ListView的导航系统。我们将从以下几个方面来详细讨论这个主题: 1. **Navigation组件简介** ...

    gtk笔记——按钮

    GTK笔记——按钮是对GTK开发时的按钮进行了详细介绍,是进行跨平台图形开发不可获缺的部分。GTK笔记——按钮是GTK开发中最基本也最常用的控件之一,它允许用户点击它们,以完成某些操作,如保存文件或结束对话等。 ...

    FPGA自学笔记——设计与验证公开版

    ### FPGA自学笔记——设计与验证公开版 #### 1. FPGA技术背景与发展趋势 随着FPGA技术的不断发展,从最初的简单逻辑粘合逐渐演变为现在的可编程片上系统(SoC),FPGA的应用范围也在不断扩大。例如Altera(现已被...

    安卓笔记——安卓详细笔记汇总

    这份名为“安卓笔记——安卓详细笔记汇总”的资源,无疑是安卓开发者或者学习者的重要参考资料。以下将对这个压缩包中可能包含的知识点进行深入解析。 首先,Android系统是基于Linux内核的开源操作系统,广泛应用于...

    Android学习笔记——Http通信 源码

    这篇"Android学习笔记——Http通信 源码"主要探讨了如何在Android应用中利用WebView控件加载网页以及使用ImageView控件加载网络图片,这两部分是Android应用与互联网交互的常见场景。 首先,我们来深入理解一下`...

    Android学习笔记——获取网络图片并显示

    需要注意的是,进行网络操作时,Android系统要求在`AndroidManifest.xml`文件中声明相应的权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 如果没有添加这个权限,程序可能会因...

    Android开发笔记——模拟器、应用教程

    Android开发笔记,内容涉及模拟器参数、进程与线程、Android 释放手机资源,进程释放优先级、分析HelloAndroid、添加编辑框与按钮、使用Intent启动另一个Activity、在不同Task中启动Activity、Intent与Intent ...

    Android开发者学习笔记——View、Canvas、bitmap

    Android开发者学习笔记——View、Canvas、bitmap Android 开发者学习笔记——View、Canvas、bitmap 是 Android 开发中常用的类,本文将通过实例讲解 View、Canvas 等相关知识点。 从资源中获取位图 在 Android ...

    Android学习笔记——Canvas & clipRect

    这篇学习笔记将深入探讨这两个概念及其在实际应用中的使用。 首先,Canvas可以理解为画布,它是Android系统提供的用于在屏幕上绘制图形的对象。在Android中,我们可以通过Canvas来绘制各种形状,如线条、矩形、圆、...

    安卓Android源码——NotePad便签.zip

    《安卓Android源码——NotePad便签》 在Android操作系统中,NotePad是经典的示例应用,用于展示基本的数据库操作、UI设计以及事件处理等核心功能。这个压缩包文件包含的就是NotePad应用的源代码,是学习Android开发...

    安卓Android源码——[安卓开源]便签软件.zip

    7. **数据存储**:Android提供多种数据存储方式,如SQLite数据库、SharedPreferences、文件系统等,便签应用可能使用其中一种来保存用户的笔记。 8. **生命周期管理**:理解Activity和Fragment的生命周期是开发...

Global site tag (gtag.js) - Google Analytics