日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android - 文件读写操作 总结

發布時間:2025/3/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android - 文件读写操作 总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/ztp800201/article/details/7322110


在android中的文件放在不同位置,它們的讀取方式也有一些不同。

本文對android中對資源文件的讀取、數據區文件的讀取、SD卡文件的讀取及RandomAccessFile的方式和方法進行了整理。供參考。


一、資源文件的讀取:

? ? ? 1) 從resource的raw中讀取文件數據:

[java]?view plaincopy
  • 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();???????????
  • ???}???

  • ?2) 從resource的asset中讀取文件數據

    [java]?view plaincopy
  • 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();???????????
  • ??
  • ???}???

  • 二、讀寫/data/data/<應用程序名>目錄上的文件:

    [java]?view plaincopy
  • //寫數據??
  • 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;???
  • ??
  • }?????

  • 三、讀寫SD卡中的文件。也就是/mnt/sdcard/目錄下面的文件 :

    [java]?view plaincopy
  • //寫數據到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;???
  • }???

  • 四、使用File類進行文件的讀寫:

    [java]?view plaincopy
  • //讀文件??
  • 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();???
  • }???

  • 五、另外,File類還有下面一些常用的操作:

    [java]?view plaincopy
  • 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();??//刪除文件夾或文件??

  • 六、使用RandomAccessFile進行文件的讀寫:

    RandomAccessFile的使用方法比較靈活,功能也比較多,可以使用類似seek的方式可以跳轉到文件的任意位置,從文件指示器當前位置開始讀寫。
    它有兩種構造方法
    new RandomAccessFile(f,"rw");//讀寫方式
    new RandomAccessFile(f,"r");//只讀方式
    使用事例:

    [java]?view plaincopy
  • /*??
  • ?*?程序功能:演示了RandomAccessFile類的操作,同時實現了一個文件復制操作。??
  • ?*/????
  • ????
  • import?java.io.*;????
  • ????
  • public?class?RandomAccessFileDemo?{????
  • ?public?static?void?main(String[]?args)?throws?Exception?{????
  • ??RandomAccessFile?file?=?new?RandomAccessFile("file",?"rw");????
  • ??//?以下向file文件中寫數據????
  • ??file.writeInt(20);//?占4個字節????
  • ??file.writeDouble(8.236598);//?占8個字節????
  • ??file.writeUTF("這是一個UTF字符串");//?這個長度寫在當前文件指針的前兩個字節處,可用readShort()讀取????
  • ??file.writeBoolean(true);//?占1個字節????
  • ??file.writeShort(395);//?占2個字節????
  • ??file.writeLong(2325451l);//?占8個字節????
  • ??file.writeUTF("又是一個UTF字符串");????
  • ??file.writeFloat(35.5f);//?占4個字節????
  • ??file.writeChar('a');//?占2個字節????
  • ????
  • ??file.seek(0);//?把文件指針位置設置到文件起始處????
  • ????
  • ??//?以下從file文件中讀數據,要注意文件指針的位置????
  • ??System.out.println("——————從file文件指定位置讀數據——————");????
  • ??System.out.println(file.readInt());????
  • ??System.out.println(file.readDouble());????
  • ??System.out.println(file.readUTF());????
  • ????
  • ??file.skipBytes(3);//?將文件指針跳過3個字節,本例中即跳過了一個boolean值和short值。????
  • ??System.out.println(file.readLong());????
  • ????
  • ??file.skipBytes(file.readShort());?//?跳過文件中“又是一個UTF字符串”所占字節,注意readShort()方法會移動文件指針,所以不用加2。????
  • ??System.out.println(file.readFloat());????
  • ??????
  • ??//以下演示文件復制操作????
  • ??System.out.println("——————文件復制(從file到fileCopy)——————");????
  • ??file.seek(0);????
  • ??RandomAccessFile?fileCopy=new?RandomAccessFile("fileCopy","rw");????
  • ??int?len=(int)file.length();//取得文件長度(字節數)????
  • ??byte[]?b=new?byte[len];????
  • ??file.readFully(b);????
  • ??fileCopy.write(b);????
  • ??System.out.println("復制完成!");????
  • ?}????
  • }????

  • 七、讀取資源文件時能否實現類似于seek的方式可以跳轉到文件的任意位置,從指定的位置開始讀取指定的字節數呢?

    答案是可以的。

    在FileInputStream和InputStream中都有下面的函數:

    [java]?view plaincopy
  • public?long?skip?(long?byteCount);?//從數據流中跳過n個字節??
  • public?int?read?(byte[]?buffer,?int?offset,?int?length);?//從數據流中讀取length數據存在buffer的offset開始的位置。offset是相對于buffer的開始位置的,不是數據流。??

  • 可以使用這兩個函數來實現類似于seek的操作,請看下面的測試代碼:

    [java]?view plaincopy
  • //其中read_raw是一個txt文件,存放在raw目錄下。??
  • //read_raw.txt文件的內容是:"ABCDEFGHIJKLMNOPQRST"??
  • public?String?getRawString()?throws?IOException?{??
  • ??????
  • ????String?str?=?null;??
  • ??????
  • ????InputStream?in?=?getResources().openRawResource(R.raw.read_raw);??
  • ??????
  • ????int?length?=?in.available();??
  • ????byte[]?buffer?=?new?byte[length];??
  • ??????
  • ????in.skip(2);?//跳過兩個字節??
  • ????in.read(buffer,0,3);?//讀三個字節??
  • ??????
  • ????in.skip(3);?//跳過三個字節??
  • ????in.read(buffer,0,3);?//讀三個字節??
  • ??????
  • ????//最后str="IJK"??
  • ????str?=?EncodingUtils.getString(buffer,?"BIG5");??
  • ??????
  • ??????
  • ????in.close();??
  • ??????
  • ????return?str;??
  • }??

  • 從上面的實例可以看出skip函數有點類似于C語言中的seek操作,但它們之間有些不同。

    需要注意的是:

    1、skip函數始終是從當前位置開始跳的。在實際應用當中還要再判斷一下該函數的返回值。

    2、read函數也始終是當前位置開始讀的。

    3、另外,還可以使用reset函數將文件的當前位置重置為0,也就是文件的開始位置。


    如何得到文件的當前位置?

    我沒有找到相關的函數和方法,不知道怎么樣才能得到文件的當前位置,貌似它也并不是太重要。


    八、如何從FileInputStream中得到InputStream?

    [java]?view plaincopy
  • 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();???
  • ??????}??
  • ??
  • }??

  • 九、APK資源文件的大小不能超過1M,如果超過了怎么辦?我們可以將這個數據再復制到data目錄下,然后再使用。復制數據的代碼如下:

    [java]?view plaincopy
  • 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


    總結:

    1、apk中有兩種資源文件,使用兩種不同的方式進行打開使用。
    raw使用InputStream in = getResources().openRawResource(R.raw.test);
    asset使用InputStream in = getResources().getAssets().open(fileName);

    這些數據只能讀取,不能寫入。更重要的是該目錄下的文件大小不能超過1M。

    同時,需要注意的是,在使用InputStream的時候需要在函數名稱后加上throws IOException。

    2、SD卡中的文件使用FileInputStream和FileOutputStream進行文件的操作。
    3、存放在數據區(/data/data/..)的文件只能使用openFileOutput和openFileInput進行操作。
    注意不能使用FileInputStream和FileOutputStream進行文件的操作。
    4、RandomAccessFile類僅限于文件的操作,不能訪問其他IO設備。它可以跳轉到文件的任意位置,從當前位置開始讀寫。

    5、InputStream和FileInputStream都可以使用skip和read(buffre,offset,length)函數來實現文件的隨機讀取。

    總結

    以上是生活随笔為你收集整理的Android - 文件读写操作 总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。