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

青蛙要fly發表於2018-02-23

前言

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

Android技能書系列:

Android基礎知識

Android技能樹 — 動畫小結

Android技能樹 — View小結

Android技能樹 — Activity小結

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

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

Android技能樹 — 多程式相關小結

Android技能樹 — Drawable小結

Android技能樹 — Fragment總體小結

資料結構基礎知識

Android技能樹 — 陣列,連結串列,雜湊表基礎小結

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

演算法基礎知識

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

這次是講Android儲存路徑及IO的基本操作。因為我們在開發的時候會經常這種方便的需求。這篇文章的內容我寫的可能很少,都沒有細寫。別吐槽。o( ̄︶ ̄)o

其他不多說,先上腦圖:

Android儲存 下載

IO操作 下載

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

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

腦圖列舉的是比較常用的。可能哪裡會有不全,大家也可以反饋。我可以再修改。

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

Android 儲存路徑

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

我這裡分為內部儲存和外部儲存,其中這裡的外部儲存指了手機內部的SDCard,很多手機可能額外還有擴充套件卡記憶體,可以增加擴充套件卡(外接SDCard),這裡我不做說明了。

內部儲存

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

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

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

我們可以看到這裡的注意點,因為以前我們的路徑一般是/data/data/xxxx,但是比如我用的是小米的6.0系統的手機,我列印出來的就是/data/user/0/xxxx

我們可以具體看/data目錄下的/app及/data這二個子目錄的功能:

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

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

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

而內部儲存下的/system和/cache目錄相對用到的很少。瞭解就可以。

外部儲存

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

我們可以看到,在對外部儲存進行讀寫操作的時候,我們需要申請相關的許可權。記不記得這二個很眼熟的許可權:

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

因為現在手機都是內建了SDCard。所以我們在實際開發中,很少去呼叫Environment.getExternalStorageState()去判斷當前SD卡是否正常掛載。當然最好還是去判斷下,然後再去操作相關的外部儲存程式碼。

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

具體下面的目錄,我也就不多說了。直接看腦圖即可。

為了大家方便記憶,我們可以這麼記,就是我們存相關資料在相應的自己的app包名下的地方,不管是內部儲存還是外部儲存,都是呼叫context.getXXXX()方法,畢竟是跟我們的APP相關的,程式碼裡面直接用context來獲取。如果是一些共用的目錄,說明本身就是存在的,直接用Environment.getXXXX()來獲取即可。

image.png

IO操作

其實IO操作平常開發時候遇到的也就是檔案的複製,或者是文字的寫入這二塊。所以大致的使用到的如下圖所示:

Android技能樹 — Android儲存路徑及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();
                }
            }
        }
複製程式碼

結語

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

我也不知道寫啥。希望大家輕點噴就對了。。。。

相關文章