最近過年剛上來,打算把本身的Android知識都整理一下。html
Android技能書系列:java
Android基礎知識android
Android技能樹 — View小結github
Android技能樹 — View事件體系小結windows
Android技能樹 — Android存儲路徑及IO操做小結數組
數據結構基礎知識
算法基礎知識
此次是講Android存儲路徑及IO的基本操做。由於咱們在開發的時候會常常這種方便的需求。這篇文章的內容我寫的可能不多,都沒有細寫。別吐槽。o( ̄︶ ̄)o
其餘很少說,先上腦圖:
腦圖列舉的是比較經常使用的。可能哪裏會有不全,你們也能夠反饋。我能夠再修改。
我這裏分爲內部存儲和外部存儲,其中這裏的外部存儲指了手機內部的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操做日常開發時候遇到的也就是文件的複製,或者是文本的寫入這二塊。因此大體的使用到的以下圖所示:
具體的我也很少說了。這裏有一篇不錯的文件,推薦一下:
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();
}
}
}
複製代碼
我也不知道寫啥。但願你們輕點噴就對了。。。。