Android進階之路——文件讀寫

今天Leo要給大家總結一些關于Android文件讀寫的操作,在大家遇到關于這方面的問題,就不用東拼西湊的百度來百度去的,好了,話不多說,切入正題。

一、概要

  1. apk中有兩種資源文件,raw下的和assert下的,這些數據只能讀取,不能寫入。更重要的是該目錄下的文件大小不能超過1M。

  2. SD卡中的文件使用FileInputStream和FileOutputStream進行文件的操作。

  3. 存放在數據區(/data/data/..)的文件只能使用openFileOutput和openFileInput進行操作。注意這里不能使用FileInputStream和FileOutputStream進行文件的操作。

二、讀寫方式

  1. 資源文件(只讀)兩種資源文件,使用兩種不同的方式進行打開使用。
    raw使用InputStream in = getResources().openRawResource(R.raw.test);
    asset使用InputStream in = getResources().getAssets().open(fileName);
    注:在使用InputStream的時候需要在函數名稱后加上throws IOException。

  2. 數據區文件(/data/data/<應用程序名>目錄上的文件)
    (1)寫操作:
    FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);
    (2)讀操作:FileInputStream fin = openFileInput(fileName);
    (3)寫操作中的使用模式:
    MODE_APPEND:即向文件尾寫入數據
    MODE_PRIVATE:即僅打開文件可寫入數據
    MODE_WORLD_READABLE:所有程序均可讀該文件數據
    MODE_WORLD_WRITABLE:即所有程序均可寫入數據。

  3. sdcard數據
    (1)讀操作
    FileInputStream fin = new FileInputStream(fileName);
    (2)寫操作
    FileOutputStream fout = new FileOutputStream(fileName);
    (3)必要步驟
    ①獲取權限
    A 獲取文件創建修改權限

    Paste_Image.png

    B 可寫
    Paste_Image.png

    ②檢查內存狀態(是否安裝sd卡)
    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
    ③讀寫操作
    關于sdcard
    注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權限
    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
    File saveFile = new File(sdCardDir, “a.txt”);
    FileOutputStream outStream = new FileOutputStream(saveFile);
    outStream.write(“test”.getBytes());
    outStream.close();
    }
    Environment.getExternalStorageState()方法用于獲取SDCard的狀態,如果手機裝有SDCard,并且可以進行讀寫,那么方法返回的狀態等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
File sdCardDir = new File(“/sdcard”); //獲取SDCard目錄
File saveFile = new File(sdCardDir, “itcast.txt”);
上面兩句代碼可以合成一句:
File saveFile = new File(“/sdcard/a.txt”);
FileInputStream是InputStream的子類

三、文件讀寫代碼示例

⒈ 資源文件的讀取:

① 從resource的raw中讀取文件數據:

String res = ""; 
try{ 

//得到資源中的Raw數據流
InputStream in = getResources().openRawResource(R.raw.test); 

//得到數據的大小
int length = in.available();       

byte [] buffer = new byte[length];        

//讀取數據
in.read(buffer);         

//依test.txt的編碼類型選擇合適的編碼,如果不調整會亂碼 
res = EncodingUtils.getString(buffer, "BIG5"); 

//關閉    
in.close();            

 }catch(Exception e){ 
  e.printStackTrace();         
 } 

② 從resource的asset中讀取文件數據:

 String fileName = "test.txt"; //文件名字 
 String res=""; 
  try{ 

  //得到資源中的asset數據流
  InputStream in = getResources().getAssets().open(fileName); 

  int length = in.available();         
  byte [] buffer = new byte[length];        

  in.read(buffer);            
  in.close();
  res = EncodingUtils.getString(buffer, "UTF-8");     

  }catch(Exception e){ 

  e.printStackTrace();         

  } 

2. 讀寫/data/data/<應用程序名>目錄上的文件:

  //寫數據
 public void writeFile(String fileName,String writestr) throws IOException{ 
  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) throws IOException{ 
    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; 
     }   

3.讀寫SD卡中的文件(也就是/mnt/sdcard/目錄下面的文件):

    //寫數據到SD中的文件
 public void writeFileSdcardFile(String fileName,String write_str) throws IOException{ 
 try{ 

   FileOutputStream fout = new FileOutputStream(fileName); 
   byte [] bytes = write_str.getBytes(); 

   fout.write(bytes); 
   fout.close(); 
 }

  catch(Exception e){ 
    e.printStackTrace(); 
   } 
 } 


    //讀SD中的文件
  public String readFileSdcardFile(String fileName) throws IOException{ 
  String res=""; 
  try{ 
     FileInputStream fin = new FileInputStream(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; 
    } 

4. 使用File類進行文件的讀寫:

  //讀文件
  public String readSDFile(String fileName) throws IOException {  

    File file = new File(fileName);  

    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;  
  }  

  //寫文件
  public void writeSDFile(String fileName, String write_str) throws IOException{  

    File file = new File(fileName);  

    FileOutputStream fos = new FileOutputStream(file);  

    byte [] bytes = write_str.getBytes(); 

    fos.write(bytes); 

    fos.close(); 
  } 

5. 另外,File類還有下面一些常用的操作:

  String Name = File.getName();  //獲得文件或文件夾的名稱:
  String parentPath = File.getParent();  //獲得文件或文件夾的父目錄
  String path = File.getAbsoultePath();//絕對路經
  String path = File.getPath();//相對路經 
  File.createNewFile();//建立文件  
  File.mkDir(); //建立文件夾  
  File.isDirectory(); //判斷是文件或文件夾
  File[] files = File.listFiles();  //列出文件夾下的所有文件和文件夾名
  File.renameTo(dest);  //修改文件夾和文件名
  File.delete();  //刪除文件夾或文件

6. 如何從FileInputStream中得到InputStream?

  public String readFileData(String fileName) throws IOException{ 
  String res=""; 
  try{ 
     FileInputStream fin = new FileInputStream(fileName); 
     InputStream in = new BufferedInputStream(fin);

     ...

  }
  catch(Exception e){ 
     e.printStackTrace(); 
  }

  }

7. APK資源文件的大小不能超過1M,如果超過了怎么辦?

我們可以將這個數據再復制到data目錄下,然后再使用。復制數據的代碼如下:

    public boolean assetsCopyData(String strAssetsFilePath, String strDesFilePath){
       boolean bIsSuc = true;
       InputStream inputStream = null;
       OutputStream outputStream = null;
       
       File file = new File(strDesFilePath);
       if (!file.exists()){
           try {
              file.createNewFile();
              Runtime.getRuntime().exec("chmod 766 " + file);
           } catch (IOException e) {
              bIsSuc = false;
           }
           
       }else{//存在
           return true;
       }
       
       try {
           inputStream = getAssets().open(strAssetsFilePath);
           outputStream = new FileOutputStream(file);
           
           int nLen = 0 ;
           
           byte[] buff = new byte[1024*1];
           while((nLen = inputStream.read(buff)) > 0){
              outputStream.write(buff, 0, nLen);
           }
           
           //完成
       } catch (IOException e) {
           bIsSuc = false;
       }finally{
           try {
              if (outputStream != null){
                  outputStream.close();
              }
              
              if (inputStream != null){
                  inputStream.close();
              }
           } catch (IOException e) {
              bIsSuc = false;
           }
           
       }
       
       return bIsSuc;
    }   

[詳細參考] (http://blog.csdn.net/ztp800201/article/details/7322110)

對于Android文件讀寫,leo就給大家介紹到這了,如有什么補充建議的地方,歡迎提出指正,喜歡的話,就點個贊吧……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • permissionn.允許;批準,正式認可,認可user permission 使用權限permission D...
    lengol閱讀 1,047評論 0 51
  • Android開發中,離不開對文件的操作。本文首先介紹了使用java對文件進行基本的讀寫操作,而后介紹了A...
    baolvlv閱讀 12,027評論 0 5
  • 一、流的概念和作用。 流是一種有順序的,有起點和終點的字節集合,是對數據傳輸的總成或抽象。即數據在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,078評論 2 95
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,492評論 0 17
  • 前幾天聽到了奇然唱琵琶行,畢業很久的我又背起了琵琶行,不一樣的感覺,余音繞梁。 向高三黨強烈推薦這首歌, 背詩有奇效啊!
    萍果派閱讀 639評論 0 2