作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
Android的数据存储(上)

Custom Tab

一、Android的文件系统

在Android中,第三方应用及其数据,都存放在data目录下。其中,应用安装包会被存放到/data/app/目录下,每个安装包的文件名都形如:应用包名.apk,以避免重复。

比如包名为com.test.sample的应用,其应用数据的目录为/data/data/com.test.sample/。对应的数据库文件存储在/data/data/com.test.sample/database/目录下,设置文件存储在/data/data/com.test.sample/shared_prefs/,自定义的应用数据文件存储在目录/data/data/com.test.sample/files/下,等等。

不仅如此,Android还会为每个应用创建一个账号,只有通过本应用的账号才有权限去运行该应用的安装包文件,读写应用数据目录下的文件(当然root权限除外啊~),从而保证了该应用数据不会再被其他应用获取或破坏。

Android的文件操作

从应用数据目录下可以看出,数据文件可以分成两类,一类是放置在扩展存储器中的文件,即/sdcard/目录下的文件,它们可以被各个应用共享;而另一类则是放在该应用数据目录下文件,它们仅能被各个应用独享,不能被其他应用读写。

(1)扩展存储器中的文件读写方式跟标准的java文件处理无异。

我们可以新建一个FileUtil的工具类来帮助我们处理文件的I/O操作,首先我们先判断SD卡的状态,看看SD卡是否可用,还有多少可用容量等。新建一个FileUtil的Class,加入方法

 // =================get SDCard information=================== 
 2     public static boolean isSdcardAvailable() { 
 3         String status = Environment.getExternalStorageState(); 
 4         //Environment.MEDIA_MOUNTED表示SD卡正常挂载 
 5         if (status.equals(Environment.MEDIA_MOUNTED)) { 
 6             return true; 
 7         } 
 8         return false; 
 9     } 
10  
11     public static long getSDAllSizeKB() { 
12         //sd卡的位置 
13         File path = Environment.getExternalStorageDirectory(); 
14         //StatFs获取的都是以block为单位的 
15         StatFs sf = new StatFs(path.getPath()); 
16         // 得到单个block的大小 
17         long blockSize = sf.getBlockSize(); 
18         // 获取所有数据块数 
19         long allBlocks = sf.getBlockCount(); 
20         // 返回SD卡大小 
21         return (allBlocks * blockSize) / 1024; // KB 
22     } 
23  
24     /** 
25      * free size for normal application 
26      * @return 
27      */ 
28     public static long getSDAvalibleSizeKB() { 
29         File path = Environment.getExternalStorageDirectory(); 
30         StatFs sf = new StatFs(path.getPath()); 
31         long blockSize = sf.getBlockSize(); 
32         long avaliableSize = sf.getAvailableBlocks(); 
33         return (avaliableSize * blockSize) / 1024;// KB 
34     }

Environment.getExternalStorageDirectory()表示获取扩展存储器的目录。(建议使用此方法动态获取,因为sdcard这个目录路径是可配置的)

StatFs.getBlockSize在API18后变为StatFs.getBlockSizeLong,其他类似的getBlock方法也一样,关于StatFs,详情可以看这篇博文

然后在activity中的button1加入事件

case R.id.button1: { 
            Log.d("TEST", "sdcard?"+FileUtil.isSdcardAvailable()); 
            Log.d("TEST", "全部容量"+(float)FileUtil.getSDAllSizeKB()/1024/1024); 
            Log.d("TEST", "可用容量"+(float)FileUtil.getSDAvalibleSizeKB()/1024/1024); 
            Toast.makeText(this, "status", Toast.LENGTH_SHORT).show(); 
            break; 
        }
/** 
     * @param director 文件夹名称 
     * @return 
     */ 
    public static boolean isFileExist(String director) { 
        File file = new File(Environment.getExternalStorageDirectory() 
                + File.separator + director); 
        return file.exists(); 
    } 
 
    /** 
     * create multiple director 
     * @param path 
     * @return 
     */ 
    public static boolean createFile(String director) { 
        if (isFileExist(director)) { 
            return true; 
        } else { 
            File file = new File(Environment.getExternalStorageDirectory() 
                    + File.separator + director); 
            if (!file.mkdirs()) { 
                return false; 
            } 
            return true; 
        } 
    }

其中File.separator是表示分隔符,在不同操作系统下是不同的,如windows就是代表"/",而在Linux下却是代表"\"。所以介意使用File.separator来代替分隔符。File.mkdirs()表示创建一个文件夹,且可附带创建父目录,而mkdir()不行,详情的File大家可以查看官方文档,或者看看这篇博文

然后在activity中的button2加入响应事件

case R.id.button2: { 
            Log.d("TEST", "example文件夹存在?"+FileUtil.isFileExist("example")); 
            Log.d("TEST", "创建forexample文件夹"+FileUtil.createFile("forexample")); 
            Toast.makeText(this, "IsFile", Toast.LENGTH_SHORT).show(); 
            break; 
        }

我们会发现在手机的sdcard目录下新建了一个forexample的文件夹。

最后我们来实现文件的读和写

写:

/** 
     *  
     * @param director 
     *            (you don't need to begin with 
     *            Environment.getExternalStorageDirectory()+File.separator) 
     * @param fileName 
     * @param content 
     * @param encoding 
     *            (UTF-8...) 
     * @param isAppend 
     *            : Context.MODE_APPEND 
     * @return 
     */ 
    public static File writeToSDCardFile(String directory, String fileName, 
            String content, String encoding, boolean isAppend) { 
        // mobile SD card path +path 
        File file = null; 
        OutputStream os = null; 
        try { 
            if (!createFile(directory)) { 
                return file; 
            } 
            file = new File(Environment.getExternalStorageDirectory() 
                    + File.separator + directory + File.separator + fileName); 
            os = new FileOutputStream(file, isAppend); 
            if (encoding.equals("")) { 
                os.write(content.getBytes()); 
            } else { 
                os.write(content.getBytes(encoding)); 
            } 
            os.flush(); 
        } catch (IOException e) { 
            Log.e("FileUtil", "writeToSDCardFile:" + e.getMessage()); 
        } finally { 
            try { 
                if (os != null) { 
                    os.close(); 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
        return file; 
    } 
 
    /** 
     * write data from inputstream to SDCard 
     */ 
    public File writeToSDCardFromInput(String directory, String fileName, 
            InputStream input) { 
        File file = null; 
        OutputStream os = null; 
        try { 
            if (createFile(directory)) { 
                return file; 
            } 
            file = new File(Environment.getExternalStorageDirectory() 
                    + File.separator + directory + File.separator + fileName); 
            os = new FileOutputStream(file); 
            byte[] data = new byte[bufferd]; 
            int length = -1; 
            while ((length = input.read(data)) != -1) { 
                os.write(data, 0, length); 
            } 
            // clear cache 
            os.flush(); 
        } catch (Exception e) { 
            Log.e("FileUtil", "" + e.getMessage()); 
            e.printStackTrace(); 
        } finally { 
            try { 
                os.close(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
        return file; 
    }

从上面可以看到有两种写入的方法,一种是将字符串直接写入,另一种是将数据流写到文件中。还有一点要提的是file的默认目录就是sdcard的目录,所以开头不必每次都要加sdcard的目录路径。

FileOutputStream(file, isAppend) 两个参数,左边是File文件,而右边是一个boolean值,为true时,数据将会接在原来文件的后面写入,而false是则会覆盖。

读:

public static String ReadFromSDCardFile(String directory,String fileName){ 
        String res="";  
        File file = null; 
        file = new File(Environment.getExternalStorageDirectory() 
                + File.separator + directory + File.separator + fileName); 
        try { 
            FileInputStream fis = new FileInputStream(file); 
            int length = fis.available(); 
            byte [] buffer = new byte[length];  
            fis.read(buffer); 
            //将字节按照编码格式转成字符串 
            res = EncodingUtils.getString(buffer, "UTF-8"); 
            fis.close(); 
            return res; 
        }catch (FileNotFoundException  e) { 
            // TODO Auto-generated catch block 
            Log.d("TEST", "FileNotFound"); 
            e.printStackTrace(); 
        }catch (Exception  e) { 
            Log.d("TEST", "Can Not Open File"); 
            e.printStackTrace(); 
        } 
        return null;      
    }

编码默认是UTF-8,若是想要改变的话,将其作为参数传入就行。

Activity中在按钮中加入响应

case R.id.button3: { 
            FileUtil.writeToSDCardFile("forexample", "test.txt",    
                    editText.getText().toString(), "UTF-8", true); 
            Toast.makeText(this, "WriteFile", Toast.LENGTH_SHORT).show(); 
            break; 
        }  
        case R.id.button4: { 
            textView.setText(FileUtil.ReadFromSDCardFile("forexample", "test.txt")); 
            Toast.makeText(this, "ReadFile", Toast.LENGTH_SHORT).show(); 
            break; 
        }

在文字编辑框上写入“我是cpacm”,先点击writefile按钮,再点击ReadFile,得到运行结果

aaaaaaaaaaaaaa.jpg

同时在根目录下的forexample文件夹里会找到test.txt,里面有着“我是cpacm”的一行字。到此,文件的读写成功。

(2)放在该应用数据目录下的文件读写

存储在应用目录下的私有数据目录,通常不会通过File类的方式直接读写,而是利用一些封装过的类或函数来操作。一般可以通过Context.openFileOutput来执行。

在Activity加入两个方法,分别为文件的读和写

public void writeFile(String fileName,String writestr){  
        try{  
                FileOutputStream fout =openFileOutput(fileName,MODE_PRIVATE);  
                byte [] bytes = writestr.getBytes();  
                fout.write(bytes);  
                fout.close();  
              }  
                catch(Exception e){  
                e.printStackTrace();  
               }  
        }  
 
        //读数据 
    public String readFile(String fileName){  
      String res="";  
      try{  
             FileInputStream fin = openFileInput(fileName);  
             int length = fin.available();  
             byte [] buffer = new byte[length];  
             fin.read(buffer);      
             res = EncodingUtils.getString(buffer, "UTF-8");  
             fin.close();      
         }  
         catch(Exception e){  
             e.printStackTrace();  
         }  
         return res;  
    }

同时在按钮的响应中加入

case R.id.button5: { 
            writeFile("test2.txt",editText.getText().toString()); 
            Toast.makeText(this, "WritePrivateFile", Toast.LENGTH_SHORT).show(); 
            break; 
        }  
        case R.id.button6: { 
            textView.setText(readFile("test2.txt")); 
            Toast.makeText(this, "ReadPrivateFile", Toast.LENGTH_SHORT).show(); 
            break; 
        }

效果图跟上张一样。

最后不要忘记在配置文件中声明权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

二、Android设置文件的使用

用户在使用应用时,常常会有一些个人偏好。为了满足不同用户的需求,应用通常会提供对应的设置项(Preference),让用户根据自己的喜好选择。这些设置信息会存储在本地并进行结构化地展示,使用户可以编辑。

设置文件的存储和使用

Android应用的设置数据,可以通过android.content.SharedPreferences类来表示。它提供了一组数据读取的接口,可以从设置文件中读取给定键值的整形数,布尔型数等数据。

首先是获取SharedPreferences

private SharedPreferences userInfo;
//在界面组件或服务组件中调用,构造应用默认的设置文件,默认文件名字为_preferences.xml 
        //userInfo = PreferenceManager.getDefaultSharedPreferences(this);   
        //或获取指定名字的SharedPreferences对象  参数分别为存储的文件名和存储模式。 
        userInfo = getSharedPreferences("preferences", Activity.MODE_PRIVATE);  
         
        //读取数据,如果无法找到则会使用默认值 
        String username = userInfo.getString("name", "未定义姓名");   
        String msg = userInfo.getString("msg", "未定义信息"); 
        //显示文本 
        textView.setText(username+","+msg);

两种获取方式,默认或者指定一个文件

接下来加入响应按钮

case R.id.button7: { 
           //获得SharedPreferences的编辑器 
           SharedPreferences.Editor editor = userInfo.edit(); 
           //将信息存入相应的键值中 
           editor.putString("name", editText.getText().toString()).commit(); 
           Toast.makeText(this, "SetName", Toast.LENGTH_SHORT).show(); 
           break; 
       }  
       case R.id.button8: { 
           //获得SharedPreferences的编辑器 
           SharedPreferences.Editor editor = userInfo.edit(); 
           //将信息存入相应的键值中ss 
           editor.putString("msg", editText.getText().toString()).commit(); 
           Toast.makeText(this, "SetMessage", Toast.LENGTH_SHORT).show(); 
           break; 
       }  
       case R.id.button9: { 
           //获得SharedPreferences文件 
           userInfo = getSharedPreferences("preferences", Activity.MODE_PRIVATE); 
           String username = userInfo.getString("name", "未定义姓名");   
           String msg = userInfo.getString("msg", "未定义信息"); 
           textView.setText(username+","+msg); 
           Toast.makeText(this, "ShowMsg", Toast.LENGTH_SHORT).show(); 
           break; 
       }  
       case R.id.button10: { 
           //输出XML文件 
           textView.setText(print()); 
           Toast.makeText(this, "ShowXML", Toast.LENGTH_SHORT).show(); 
           break; 
       }

按钮7,8可以设置信息,按钮9则从SharedPreferences文件中读取信息并显示在文字框中。按钮10会显示这个XML文件中的所有信息。

ssssssssssssss.png

访问其他应用中的Preference(在SecondApp中访问FirstApp的数据),前提条件是:FirstApp的preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。

如:在<package name>为com.first.app的应用使用下面语句创建了preference("first_app_perferences")。

Java代码

getSharedPreferences("first_app_perferences", Context.MODE_WORLD_READABLE);

在SecondApp中要访问FirstApp应用中的preference,首先需要创建FirstApp应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference

Context firstAppContext = createPackageContext("com.first.app", Context.CONTEXT_IGNORE_SECURITY);    
SharedPreferences sharedPreferences = firstAppContext.getSharedPreferences("first_app_perferences", 
 Context.MODE_WORLD_READABLE);   string name = sharedPreferences.getString("name", "");  
  int age = sharedPreferences.getInt("age", 0);

如果不通过创建Context访问FirstApp应用的preference,可以以读取xml文件方式直接访问FirstApp应用的preference对应的xml文件,

如:

File xmlFile = new File(“/data/data/<package name>/shared_prefs/first_app_perferences.xml”);
//<package name>应替换成应用的包名: com.first.app

设置界面组件

有一类特殊的Preference对象:android.preference.PreferenceGroup。它是容器型的Preference对象,负责管理一组相关联的Preference对象。设置项编辑的界面组件,通常派生自android.preference.PreferenceActivity类。它可以将一个定制好的设置树转换成对应的控件呈现出来。

public class PreferencesDemo extends PreferenceActivity{ 
     @Override 
     public void onCreate(Bundle savadInstanceState){ 
         super.onCreate(savadInstanceState); 
         this.addPreferencesFromResource(R.xml.preference); 
     } 
}

其中,R.xml.preference表示描述设置信息的资源文件。放在XML资源目录下。

详细可以参考Android的配置界面PreferenceActivity

1 public class MainActivity extends Activity implements OnClickListener { 
  2      
  3      /** 存储后的文件路径:/data/data/<package name>/shares_prefs + 文件名.xml */  
  4     public static final String PATH = "/data/data/com.example.datademo/shared_prefs/preferences.xml"; 
  5     private SharedPreferences userInfo; 
  6  
  7     private Button button1; 
  8     private Button button2; 
  9     private Button button3; 
 10     private Button button4; 
 11     private Button button5; 
 12     private Button button6; 
 13     private Button button7; 
 14     private Button button8; 
 15     private Button button9; 
 16     private Button button10; 
 17     private TextView textView; 
 18     private EditText editText; 
 19  
 20     @Override 
 21     protected void onCreate(Bundle savedInstanceState) { 
 22         super.onCreate(savedInstanceState); 
 23         setContentView(R.layout.activity_main); 
 24  
 25         // 获得界面的控件 
 26         textView = (TextView) findViewById(R.id.textView1); 
 27         editText = (EditText) findViewById(R.id.editText1); 
 28         button1 = (Button) findViewById(R.id.button1); 
 29         button1.setOnClickListener(this); 
 30         button2 = (Button) findViewById(R.id.button2); 
 31         button2.setOnClickListener(this); 
 32         button3 = (Button) findViewById(R.id.button3); 
 33         button3.setOnClickListener(this); 
 34         button4 = (Button) findViewById(R.id.button4); 
 35         button4.setOnClickListener(this); 
 36         button5 = (Button) findViewById(R.id.button5); 
 37         button5.setOnClickListener(this); 
 38         button6 = (Button) findViewById(R.id.button6); 
 39         button6.setOnClickListener(this); 
 40         button7 = (Button) findViewById(R.id.button7); 
 41         button7.setOnClickListener(this); 
 42         button8 = (Button) findViewById(R.id.button8); 
 43         button8.setOnClickListener(this); 
 44         button9 = (Button) findViewById(R.id.button9); 
 45         button9.setOnClickListener(this); 
 46         button10 = (Button) findViewById(R.id.button10); 
 47         button10.setOnClickListener(this); 
 48          
 49         //在界面组件或服务组件中调用,构造应用默认的设置文件,默认文件名字为_preferences.xml 
 50         //userInfo = PreferenceManager.getDefaultSharedPreferences(this);   
 51         //或获取指定名字的SharedPreferences对象  参数分别为存储的文件名和存储模式。 
 52         userInfo = getSharedPreferences("preferences.xml", Activity.MODE_PRIVATE);  
 53          
 54         //读取数据,如果无法找到则会使用默认值 
 55         String username = userInfo.getString("name", "未定义姓名");   
 56         String msg = userInfo.getString("msg", "未定义信息"); 
 57         //显示文本 
 58         textView.setText(username+","+msg); 
 59     } 
 60  
 61     @Override 
 62     public void onClick(View v) { 
 63         // TODO Auto-generated method stub 
 64         switch (v.getId()) { 
 65         case R.id.button1: { 
 66             Log.d("TEST", "sdcard?"+FileUtil.isSdcardAvailable()); 
 67             Log.d("TEST", "全部容量"+(float)FileUtil.getSDAllSizeKB()/1024/1024); 
 68             Log.d("TEST", "可用容量"+(float)FileUtil.getSDAvalibleSizeKB()/1024/1024); 
 69             Toast.makeText(this, "status", Toast.LENGTH_SHORT).show(); 
 70             break; 
 71         } 
 72         case R.id.button2: { 
 73             Log.d("TEST", "example文件夹存在?"+FileUtil.isFileExist("example")); 
 74             Log.d("TEST", "创建forexample文件夹"+FileUtil.createFile("forexample")); 
 75             Toast.makeText(this, "IsFile", Toast.LENGTH_SHORT).show(); 
 76             break; 
 77         }   
 78         case R.id.button3: { 
 79             FileUtil.writeToSDCardFile("forexample", "test.txt",    
 80                     editText.getText().toString(), "UTF-8", true); 
 81             Toast.makeText(this, "WriteFile", Toast.LENGTH_SHORT).show(); 
 82             break; 
 83         }  
 84         case R.id.button4: { 
 85             textView.setText(FileUtil.ReadFromSDCardFile("forexample", "test.txt")); 
 86             Toast.makeText(this, "ReadFile", Toast.LENGTH_SHORT).show(); 
 87             break; 
 88         }  
 89         case R.id.button5: { 
 90             writeFile("test2.txt",editText.getText().toString()); 
 91             Toast.makeText(this, "WritePrivateFile", Toast.LENGTH_SHORT).show(); 
 92             break; 
 93         }  
 94         case R.id.button6: { 
 95             textView.setText(readFile("test2.txt")); 
 96             Toast.makeText(this, "ReadPrivateFile", Toast.LENGTH_SHORT).show(); 
 97             break; 
 98         }  
 99         case R.id.button7: { 
100             //获得SharedPreferences的编辑器 
101             SharedPreferences.Editor editor = userInfo.edit(); 
102             //将信息存入相应的键值中 
103             editor.putString("name", editText.getText().toString()).commit(); 
104             Toast.makeText(this, "SetName", Toast.LENGTH_SHORT).show(); 
105             break; 
106         }  
107         case R.id.button8: { 
108             //获得SharedPreferences的编辑器 
109             SharedPreferences.Editor editor = userInfo.edit(); 
110             //将信息存入相应的键值中ss 
111             editor.putString("msg", editText.getText().toString()).commit(); 
112             Toast.makeText(this, "SetMessage", Toast.LENGTH_SHORT).show(); 
113             break; 
114         }  
115         case R.id.button9: { 
116             userInfo = getSharedPreferences("preferences.xml", Activity.MODE_PRIVATE); 
117             String username = userInfo.getString("name", "未定义姓名");   
118             String msg = userInfo.getString("msg", "未定义信息"); 
119             textView.setText(username+","+msg); 
120             Toast.makeText(this, "ShowMsg", Toast.LENGTH_SHORT).show(); 
121             break; 
122         }  
123         case R.id.button10: { 
124             textView.setText(print()); 
125             Toast.makeText(this, "ShowXML", Toast.LENGTH_SHORT).show(); 
126             break; 
127         }  
128         } 
129     } 
130      
131     public void writeFile(String fileName,String writestr){  
132         try{  
133                 FileOutputStream fout =openFileOutput(fileName,MODE_PRIVATE);  
134                 byte [] bytes = writestr.getBytes();  
135                 fout.write(bytes);  
136                 fout.close();  
137               }  
138                 catch(Exception e){  
139                 e.printStackTrace();  
140                }  
141         }  
142  
143         //读数据 
144     public String readFile(String fileName){  
145       String res="";  
146       try{  
147              FileInputStream fin = openFileInput(fileName);  
148              int length = fin.available();  
149              byte [] buffer = new byte[length];  
150              fin.read(buffer);      
151              res = EncodingUtils.getString(buffer, "UTF-8");  
152              fin.close();      
153          }  
154          catch(Exception e){  
155              e.printStackTrace();  
156          }  
157          return res;  
158     } 
159      
160     private String print() {   
161         StringBuffer buff = new StringBuffer();   
162         try {   
163             BufferedReader reader = new BufferedReader(new InputStreamReader(   
164                     new FileInputStream(PATH)));   
165             String str;   
166             while ((str = reader.readLine()) != null) {   
167                 buff.append(str + "/n");   
168             }   
169         } catch (Exception e) {   
170             e.printStackTrace();   
171         }   
172         return buff.toString();   
173     } 
174  
175 }
1 package com.example.datademo; 
  2  
  3 import java.io.File; 
  4 import java.io.FileInputStream; 
  5 import java.io.FileNotFoundException; 
  6 import java.io.FileOutputStream; 
  7 import java.io.IOException; 
  8 import java.io.InputStream; 
  9 import java.io.OutputStream; 
 10  
 11 import org.apache.http.util.EncodingUtils; 
 12  
 13 import android.os.Environment; 
 14 import android.os.StatFs; 
 15 import android.util.Log; 
 16  
 17 public class FileUtil { 
 18     private static int bufferd = 1024; 
 19  
 20     private FileUtil() { 
 21     } 
 22  
 23     /* 
 24      * <!-- 在SDCard中创建与删除文件权限 --> <uses-permission 
 25      * android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 
 26      * 往SDCard写入数据权限 --> <uses-permission 
 27      * android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
 28      */ 
 29  
 30     // =================get SDCard information=================== 
 31     public static boolean isSdcardAvailable() { 
 32         String status = Environment.getExternalStorageState(); 
 33         //Environment.MEDIA_MOUNTED表示SD卡正常挂载 
 34         //sd卡   http://blog.csdn.net/yuzhiboyi/article/details/8645730 
 35         if (status.equals(Environment.MEDIA_MOUNTED)) { 
 36             return true; 
 37         } 
 38         return false; 
 39     } 
 40  
 41     public static long getSDAllSizeKB() { 
 42         // get path of sdcard 
 43         File path = Environment.getExternalStorageDirectory(); 
 44         //StatFs获取的都是以block为单位的   http://blog.csdn.net/pang3510726681/article/details/6969557 
 45         StatFs sf = new StatFs(path.getPath()); 
 46         // get single block size(Byte) 
 47         long blockSize = sf.getBlockSize(); 
 48         // 获取所有数据块数 
 49         long allBlocks = sf.getBlockCount(); 
 50         // 返回SD卡大小 
 51         return (allBlocks * blockSize) / 1024; // KB 
 52     } 
 53  
 54     /** 
 55      * free size for normal application 
 56      *  
 57      * @return 
 58      */ 
 59     public static long getSDAvalibleSizeKB() { 
 60         File path = Environment.getExternalStorageDirectory(); 
 61         StatFs sf = new StatFs(path.getPath()); 
 62         long blockSize = sf.getBlockSize(); 
 63         long avaliableSize = sf.getAvailableBlocks(); 
 64         return (avaliableSize * blockSize) / 1024;// KB 
 65     } 
 66  
 67     // =====================File Operation========================== 
 68     /** 
 69      * @param director 文件夹名称 
 70      * @return 
 71      */ 
 72     public static boolean isFileExist(String director) { 
 73         File file = new File(Environment.getExternalStorageDirectory() 
 74                 + File.separator + director); 
 75         return file.exists(); 
 76     } 
 77  
 78     /** 
 79      * create multiple director 
 80      *  
 81      * @param path 
 82      * @return 
 83      */ 
 84     public static boolean createFile(String director) { 
 85         if (isFileExist(director)) { 
 86             return true; 
 87         } else { 
 88             File file = new File(Environment.getExternalStorageDirectory() 
 89                     + File.separator + director); 
 90             if (!file.mkdirs()) { 
 91                 return false; 
 92             } 
 93             return true; 
 94         } 
 95     } 
 96  
 97     public static File writeToSDCardFile(String directory, String fileName, 
 98             String content, boolean isAppend) { 
 99         return writeToSDCardFile(directory, fileName, content, "", isAppend); 
100     } 
101  
102     /** 
103      *  
104      * @param director 
105      *            (you don't need to begin with 
106      *            Environment.getExternalStorageDirectory()+File.separator) 
107      * @param fileName 
108      * @param content 
109      * @param encoding 
110      *            (UTF-8...) 
111      * @param isAppend 
112      *            : Context.MODE_APPEND 
113      * @return 
114      */ 
115     public static File writeToSDCardFile(String directory, String fileName, 
116             String content, String encoding, boolean isAppend) { 
117         // mobile SD card path +path 
118         File file = null; 
119         OutputStream os = null; 
120         try { 
121             if (!createFile(directory)) { 
122                 return file; 
123             } 
124             file = new File(Environment.getExternalStorageDirectory() 
125                     + File.separator + directory + File.separator + fileName); 
126             os = new FileOutputStream(file, isAppend); 
127             if (encoding.equals("")) { 
128                 os.write(content.getBytes()); 
129             } else { 
130                 os.write(content.getBytes(encoding)); 
131             } 
132             os.flush(); 
133         } catch (IOException e) { 
134             Log.e("FileUtil", "writeToSDCardFile:" + e.getMessage()); 
135         } finally { 
136             try { 
137                 if (os != null) { 
138                     os.close(); 
139                 } 
140             } catch (IOException e) { 
141                 e.printStackTrace(); 
142             } 
143         } 
144         return file; 
145     } 
146  
147     /** 
148      * write data from inputstream to SDCard 
149      */ 
150     public static File writeToSDCardFromInput(String directory, String fileName, 
151             InputStream input) { 
152         File file = null; 
153         OutputStream os = null; 
154         try { 
155             if (createFile(directory)) { 
156                 return file; 
157             } 
158             file = new File(Environment.getExternalStorageDirectory() 
159                     + File.separator + directory + File.separator + fileName); 
160             os = new FileOutputStream(file); 
161             byte[] data = new byte[bufferd]; 
162             int length = -1; 
163             while ((length = input.read(data)) != -1) { 
164                 os.write(data, 0, length); 
165             } 
166             // clear cache 
167             os.flush(); 
168         } catch (Exception e) { 
169             Log.e("FileUtil", "" + e.getMessage()); 
170             e.printStackTrace(); 
171         } finally { 
172             try { 
173                 os.close(); 
174             } catch (Exception e) { 
175                 e.printStackTrace(); 
176             } 
177         } 
178         return file; 
179     } 
180      
181     public static String ReadFromSDCardFile(String directory,String fileName){ 
182         String res="";  
183         File file = null; 
184         file = new File(Environment.getExternalStorageDirectory() 
185                 + File.separator + directory + File.separator + fileName); 
186         try { 
187             FileInputStream fis = new FileInputStream(file); 
188             int length = fis.available(); 
189             byte [] buffer = new byte[length];  
190             fis.read(buffer); 
191             res = EncodingUtils.getString(buffer, "UTF-8"); 
192             fis.close(); 
193             return res; 
194         }catch (FileNotFoundException  e) { 
195             // TODO Auto-generated catch block 
196             Log.d("TEST", "FileNotFound"); 
197             e.printStackTrace(); 
198         }catch (Exception  e) { 
199             Log.d("TEST", "Can Not Open File"); 
200             e.printStackTrace(); 
201         } 
202         return null;      
203     } 
204 }

转载自:http://mobile.51cto.com/aprogram-449790.htm



Home