Android技能樹 — Android存儲路徑及IO操做小結

前言

最近過年剛上來,打算把本身的Android知識都整理一下。html

Android技能書系列:java

Android基礎知識android

Android技能樹 — 動畫小結git

Android技能樹 — View小結github

Android技能樹 — Activity小結算法

Android技能樹 — View事件體系小結windows

Android技能樹 — Android存儲路徑及IO操做小結數組

Android技能樹 — 多進程相關小結bash

Android技能樹 — Drawable小結數據結構

Android技能樹 — Fragment整體小結

數據結構基礎知識

Android技能樹 — 數組,鏈表,散列表基礎小結

Android技能樹 — 樹基礎知識小結(一)

算法基礎知識

Android技能樹 — 排序算法基礎小結

此次是講Android存儲路徑及IO的基本操做。由於咱們在開發的時候會常常這種方便的需求。這篇文章的內容我寫的可能不多,都沒有細寫。別吐槽。o( ̄︶ ̄)o

其餘很少說,先上腦圖:

Android存儲 下載

IO操做 下載

Android存儲路徑

腦圖列舉的是比較經常使用的。可能哪裏會有不全,你們也能夠反饋。我能夠再修改。

Android 存儲路徑

我這裏分爲內部存儲和外部存儲,其中這裏的外部存儲指了手機內部的SDCard,不少手機可能額外還有擴展卡內存,能夠增長擴展卡(外置SDCard),這裏我不作說明了。

內部存儲

其實咱們用到的最多的/data目錄下的。

咱們能夠看到這裏的注意點,由於之前咱們的路徑通常是/data/data/xxxx,可是好比我用的是小米的6.0系統的手機,我打印出來的就是/data/user/0/xxxx

咱們能夠具體看/data目錄下的/app及/data這二個子目錄的功能:

具體我也就不細說了。腦圖也已經寫得也清楚了。

而內部存儲下的/system和/cache目錄相對用到的不多。瞭解就能夠。

外部存儲

咱們能夠看到,在對外部存儲進行讀寫操做的時候,咱們須要申請相關的權限。記不記得這二個很眼熟的權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
複製代碼

由於如今手機都是內置了SDCard。因此咱們在實際開發中,不多去調用Environment.getExternalStorageState()去判斷當前SD卡是否正常掛載。固然最好仍是去判斷下,而後再去操做相關的外部存儲代碼。

具體下面的目錄,我也就很少說了。直接看腦圖便可。

爲了你們方便記憶,咱們能夠這麼記,就是咱們存相關數據在相應的本身的app包名下的地方,不論是內部存儲仍是外部存儲,都是調用context.getXXXX()方法,畢竟是跟咱們的APP相關的,代碼裏面直接用context來獲取。若是是一些共用的目錄,說明自己就是存在的,直接用Environment.getXXXX()來獲取便可。

image.png

IO操做

其實IO操做日常開發時候遇到的也就是文件的複製,或者是文本的寫入這二塊。因此大體的使用到的以下圖所示:

具體的我也很少說了。這裏有一篇不錯的文件,推薦一下:

java中的IO操做總結

字節流(實現文件的複製):

  1. 不使用緩衝:
String source = "xxxxx/xxxxx/source.mp4";
String target = "xxx/xxxx/target.mp4";

FileOutputStream outputStream = null;
FileInputStream inputStream = null;

try {
     outputStream = new FileOutputStream(target);
     inputStream = new FileInputStream(source);

     int temp = 0;
     byte[] buf = new byte[1024];
     while ((temp = inputStream.read(buf)) != -1){
          outputStream.write(buf,0,temp);
     }

} catch (Exception e) {
      e.printStackTrace();
}finally {
      if(inputStream != null){
         try {
             inputStream.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
            
       if(outputStream != null){
          try {
              outputStream.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
       }
}
複製代碼
  1. 使用緩衝
String source = "xxxxx/xxxxx/source.mp4";
String target = "xxx/xxxx/target.mp4";

FileOutputStream outputStream = null;
FileInputStream inputStream = null;
BufferedOutputStream bufferedOutputStream = null;
BufferedInputStream bufferedInputStream = null;

try {
     outputStream = new FileOutputStream(target);
     inputStream = new FileInputStream(source);
     bufferedOutputStream = new BufferedOutputStream(outputStream);
     bufferedInputStream = new BufferedInputStream(inputStream);

     int temp = 0;
     byte[] buf = new byte[1024];
     while ((temp = bufferedInputStream.read(buf)) != -1){
         bufferedOutputStream.write(buf,0,temp);
     }
     
} catch (Exception e) {
     e.printStackTrace();
}finally {
    if(bufferedInputStream != null){
         try {
            bufferedInputStream.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
     }

     if(bufferedOutputStream != null){
         try {
            bufferedOutputStream.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
     }
}
複製代碼

字符流(實現文件內容的複製):

  1. 不使用緩衝:
String source = "xxxxx/xxxxx/source.txt";
        String target = "xxx/xxxx/target.txt";
        FileReader reader = null;
        FileWriter writer = null;
        try {
            reader = new FileReader(source);
            writer = new FileWriter(target);

            int temp = 0;
            //單字符寫入
            while ((temp = reader.read()) == -1) {
                writer.write(temp);
            }

            //字符數組方式寫入
            int temp1 = 0;
            char[] buf = new char[1024];
            while ((temp1 = reader.read(buf)) != -1) {
                writer.write(new String(buf, 0, temp1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
複製代碼
  1. 使用緩衝:
String source = "xxxxx/xxxxx/source.txt";
        String target = "xxx/xxxx/target.txt";
        FileReader reader = null;
        FileWriter writer = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            reader = new FileReader(source);
            writer = new FileWriter(target);
            bufferedReader = new BufferedReader(reader);
            bufferedWriter = new BufferedWriter(writer);

            String content = null;
            //readLine()方法只返回換行符以前的數據
            while ((content = bufferedReader.readLine()) != null) {
                bufferedWriter.write(content);
                //寫完文件內容以後換行,windows下的換行是\r\n,Linux下則是\n
                bufferedWriter.newLine();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
複製代碼

結語

我也不知道寫啥。但願你們輕點噴就對了。。。。

相關文章
相關標籤/搜索