前言
最近過年剛上來,打算把自己的Android知識都整理一下。
Android技能書系列:
Android基礎知識
Android技能樹 — Android儲存路徑及IO操作小結
資料結構基礎知識
演算法基礎知識
這次是講Android儲存路徑及IO的基本操作。因為我們在開發的時候會經常這種方便的需求。這篇文章的內容我寫的可能很少,都沒有細寫。別吐槽。o( ̄︶ ̄)o
其他不多說,先上腦圖:
腦圖列舉的是比較常用的。可能哪裡會有不全,大家也可以反饋。我可以再修改。
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()
來獲取即可。
IO操作
其實IO操作平常開發時候遇到的也就是檔案的複製,或者是文字的寫入這二塊。所以大致的使用到的如下圖所示:
具體的我也不多說了。這裡有一篇不錯的檔案,推薦一下:
位元組流(實現檔案的複製):
- 不使用緩衝:
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();
}
}
}
複製程式碼
- 使用緩衝
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();
}
}
}
複製程式碼
字元流(實現檔案內容的複製):
- 不使用緩衝:
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();
}
}
}
複製程式碼
- 使用緩衝:
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();
}
}
}
複製程式碼
結語
我也不知道寫啥。希望大家輕點噴就對了。。。。