Android文件讀寫操作
一、文件的基本操作
Android中可以在設備本身的存儲設備或外接的存儲設備中創建用於保存數據的文件。在默認狀態下,文件是不能在不同程序間共享的。
當用戶卸載您的應用程序時,這些文件刪除。
文件存儲數據可以通過openFileOutput方法打開一個文件(如果這個)文件不存在就自動創建這個文件),通過load方法來獲取文件中的
數據,通過deleteFile方法刪除一個指定的文件。
1,常用方法介紹:
File是通過FileInputStream和FileOutputStream對文件進行操作。Context提供了如下兩個方法來打開本應用程序的數據文件將愛麗的文件IO流。FileInputStream openFileInput(String name):打開應用程序的數據文件夾下的name文件對應輸入流。FileOutputStream openFileOutput(String name,int mode):打開應用程序的數據文件夾下的name文件對應輸出流。參數:mode 指定打開文件的模式,該模式支持如下值:MODE_PRIVATE :該文件只能被當前程序讀寫。MODE_APPEND:以追加方式打開該文件,應用程序可以向該文件中追加內容。MODE_WORLD_READABLE:該文件的內容可以被其他應用程序讀取。MODE_WORLD_WRITEABLE:該文件的內容可由其他程序讀、寫。getDir(String name,int mode):在應用程序的數據文件夾下獲取或創建name對應的子目錄。File getFilesDir():獲取該應用程序的數據文件夾的絕對路徑。String[] fileList():返回該應用程序中的數據文件夾下的全部文件。deleteFile(String):刪除該應用程序的數據文件夾下的指定文件。
2,文件的創建、刪除、重命名
//創建文件的名稱public static final String FILE_NAME="myFile.txt";(1)創建文件代碼示例:
File file=new File(FileUtil.FILE_NAME);//文件是否存在if(!file.exists()){try {//文件不存在,就創建一個新文件file.createNewFile();System.out.println("文件已經創建了");} catch (IOException e) {e.printStackTrace();}}else{System.out.println("文件已經存在");System.out.println("文件名:"+file.getName());System.out.println("文件絕對路徑為:"+file.getAbsolutePath());//是存在工程目錄下,所以System.out.println("文件相對路徑為:"+file.getPath());System.out.println("文件大小為:"+file.length()+"字節");System.out.println("文件是否可讀:"+file.canRead());System.out.println("文件是否可寫:"+file.canWrite());System.out.println("我呢間是否隱藏:"+file.isHidden());}
(2)刪除文件示例:
File file=new File(FileUtil.FILE_NAME);//文件是否存在if(file.exists()){file.delete();System.out.println("文件已經被刪除了");}
(3)為文件重命名示例:
File file=new File(FileUtil.FILE_NAME);File newFile=new File("anotherFile.txt");file.renameTo(newFile);System.out.println("文件已經成功地被命名了"+file.getName());
注意:當我們為文件重命名時,僅僅操作的是文件本身,內部的內容不會改變。
2,文件夾的創建和刪除
//創建文件夾的名稱//public static final String FOLDER_NAME="NewFolder";//多級目錄,不能用//** File.separator路徑分隔符* 在文件夾的目錄結構中,只要任一級目錄不存在,那么都會不存在。* 比如"NewFolder2"+File.separator+"separator2"此路徑,NewFolder2沒有存在,* 所以NewFolder2和separator2都不存在* */public static final String FOLDER_NAME="NewFolder"+File.separator+"separator";(1)創建文件夾代碼示例
File folder=new File(FileUtil.FOLDER_NAME);if(!folder.exists()){//創建文件夾,一旦存在相同的文件或文件夾,是不可能存在的。/** * 在文件夾的目錄結構中,只要任一級目錄不存在,那么都會不存在。* 比如"NewFolder2"+File.separator+"separator2"此路徑,NewFolder2沒有存在,* 所以NewFolder2和separator2都不存在* */// folder.mkdir();/** 不管路徑是否存在,都會慢慢向下一級創建文件夾。* 所以創建文件夾我們一般用此方法,確定穩定性。* */folder.mkdirs();}File同時可以表示文件或文件夾
(2)刪除文件夾
File folder=new File(FileUtil.FOLDER_NAME);if(folder.exists()){/** 在移除的時候,只會移除最下層的目錄,不會移除多層目錄。* */folder.delete();}
完整代碼下載:
二、讀取Assets中的文件數據
在asset目錄下的資源是無法直接訪問的原生資源,但是這個目錄保存的文件可以打包在程序里,Android應用通過Assetmanager來管理該目錄下的原始資源.
Android不為Assets下的文件生成id,如要使用assets里的文件,需要指定文件的路徑和文件名。
代碼使用示例:
(1)在assets中創建文件:info.txt
文件內容為:1,這是使用UTF-8編寫的一個文本2,這是第二行代碼3,3行4,4行
(2)activity_main.xml中的布局
<RelativeLayout xmlns:android=" http://schemas.android.com/apk/res/android"xmlns:tools=" http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"tools:context="com.yuyan.android_file.MainActivity" ><Buttonandroid:id="@+id/readtxtBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="讀取TXT數據" /></RelativeLayout>
(3)MainActivity.java
private static final String TAG="ReadAssets";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.readtxtBtn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//讀取的內容會隨着文件的改變而改變try {//讀取的是字節流InputStream is=getResources().getAssets().open("info.txt");//UTF-8編碼的指定是很重要的InputStreamReader isr=new InputStreamReader(is,"UTF-8");BufferedReader bfr=new BufferedReader(isr);String in="";while((in=bfr.readLine())!=null){Log.i(TAG, in);}// Log.i(TAG, bfr.readLine());} catch (IOException e) {e.printStackTrace();}}});}
完整代碼下載:
三、讀取raw目錄中的文件數據
如果你想要將靜態文件保存在您的應用程序在編譯時,將文件保存在您的項目res/raw/目錄。Android SDK會處理該目錄下原始資源,並會在R清單類中為該目錄下的資源生成一個索引項。
你可以打開它與openRawResource(),通過R.raw.<filename>的資源 id。此方法返回的InputStream,您可以使用讀取該文件 (但你不能寫入原始文件)。
(1)activity_main.xml
<RelativeLayout xmlns:android=" http://schemas.android.com/apk/res/android"xmlns:tools=" http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.yuyan.android_raw.MainActivity" ><Buttonandroid:id="@+id/readrawBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="讀取Raw文件夾中的數據" /></RelativeLayout>
(2)MainActivity.java
private static final String TAG="RawData";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.readrawBtn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {InputStream is=getResources().openRawResource(R.raw.info);InputStreamReader isr=new InputStreamReader(is,"UTF-8");BufferedReader bfr=new BufferedReader(isr);String instring="";while((instring=bfr.readLine())!=null){Log.i(TAG, instring);}} catch (NotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}
完整代碼下載:
四、讀寫內部存儲的文件數據
程序一旦在虛擬機或真機運行后,程序就會在固定地方創建一個文件夾。
應用程序的數據文件默認位置保存在:
/data/data/<package name>/files 目錄下。
<package name>代表應用程序的包名。
一旦運行,就會在DDMs中創建一個內部的文件夾.比如運行一個包名為com.yuyan.android_internaldata的應用程序:
打開DDMS——>File Explorer——>data——>data——找到我們內部的工程——這個目錄就是我們內部存儲空間,對於其他應用是保密的。
就可以找到此應用程序的數據存儲位置。
代碼使用示例:
activity_main.xml
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android"xmlns:tools=" http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.yuyan.android_internaldata.MainActivity" ><EditTextandroid:id="@+id/et"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="在這里輸入內容" /><Buttonandroid:id="@+id/writeBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="保存數據" /><Buttonandroid:id="@+id/readBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="讀取數據" /><TextViewandroid:id="@+id/show"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
MainActivity.java
et=(EditText) findViewById(R.id.et);show=(TextView) findViewById(R.id.show);findViewById(R.id.writeBtn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {//將文件數據寫到應用的內部存儲/** 注意:獲取流的方式通過openFileInput函數,指定文件名以及后綴* 參數1.文件名和后綴 2.文件模式* 保存在手機data/data/包名/files* */FileOutputStream fos=openFileOutput(fileName, Context.MODE_PRIVATE);OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");osw.write(et.getText().toString());//保證輸出緩沖區中的所有內容osw.flush();fos.flush();//后打開的先關閉,逐層向內關閉fos.close();osw.close();Toast.makeText(MainActivity.this, "寫入完成", Toast.LENGTH_LONG).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});findViewById(R.id.readBtn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {FileInputStream fis=openFileInput(fileName);InputStreamReader is=new InputStreamReader(fis,"UTF-8");//fis.available()文件可用長度char input[]=new char[fis.available()];is.read(input);is.close();fis.close();String readed=new String(input);show.setText(readed);} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});
完整代碼下載:
五、讀寫外部存儲的文件數據
1,認識
外部存儲:每一個 Android 兼容設備支持共享的"外部存儲器",你可以使用保存的文件。
這可以是一個可移動存儲媒體 (如 SD 卡) 或內部的 (非可移動) 存儲。保存
到外部存儲的文件是可讀的世界和他們啟用 USB 大容量存儲傳輸計算機上的文件
時,可以由用戶修改。
謹慎 ︰
如果用戶在計算機上安裝外部存儲或刪除媒體,並沒有強制執行時您將保存
到外部存儲的文件的安全,外部存儲可以變得不可用。所有應用程序都可以讀取和
寫入的文件放置在外部存儲,用戶可以刪除它們。
SD卡數據存儲路徑;DDMS-->mnt-->sdcard(這里就是sd卡的掛載的位置)
其實真正的sdcard在storage的sdcard中——所對應的操作目錄。
2,讀、寫SD卡上的文件如下步驟:
a,調用Environment的getExternalStorageState()方法判斷手機上是否插入了SD卡,並且應用程序具有讀寫SD卡的權限。例如使用如下代碼:
//如果手機已插入SD卡,且應用程序具有讀寫SD卡的能力,//下面語句返回trueEnvironment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
b,調用Environment的getExternalStorageDirectory()方法來獲取,外部存儲器,也就是SD卡的目錄.c,調用FileInputStream、FileOutPutStream、FileReader或FileWriter讀、寫SD卡里的文件。
3,應用程序讀、寫SD卡的文件注意以下兩點:
a,手機上應該已插入SD卡。
b,為了讀、寫SD卡上的數據,必須在應用程序的配置文件(AndroidManifest.xml)中添加讀、寫SD卡的權限,例如如下配置:
<!-- 在SD卡中創建與刪除文件權限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 向SD卡寫入數據權限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:當開發者直接在Eclipse中運行Android應用程序 時,Eclipse默認啟動的模擬器是不帶SD卡的,為了讓Eclipse啟動的模擬器上帶上SD卡,可以通過 Run As->Run Configurations菜單項打開如下圖所示對話框,通過對話框的附加選項來使用SD卡(實際上就是在啟動模擬器時 早呢更加-sdcard選項)。
代碼使用示例:
activity_main.xml
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android"xmlns:tools=" http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".Read_InternalMemory" ><EditTextandroid:id="@+id/EtExternal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="在這里輸入內容" /><Buttonandroid:id="@+id/BtnExternalSave"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="寫入數據" /><Buttonandroid:id="@+id/BtnEXternalRead"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="讀取數據" /><TextViewandroid:id="@+id/TvExternalShow"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
MainActivity.java
private String fileName="text";private TextView show;private EditText et;//判斷手機上是否已經插了sdcard// if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))//獲取當前sdcard的工作目錄File sdcard=Environment.getExternalStorageDirectory();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);show=(TextView) findViewById(R.id.TvExternalShow);et=(EditText) findViewById(R.id.EtExternal);//寫入數據findViewById(R.id.BtnExternalSave).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {File myfile=new File(sdcard,"this is my file.txt");if(!sdcard.exists()){Toast.makeText(getApplicationContext(), "當前系統不具備SD卡目錄", Toast.LENGTH_LONG).show();return;}try {myfile.createNewFile();Toast.makeText(getApplicationContext(), "文件已經創建完成", Toast.LENGTH_LONG).show();FileOutputStream fos=new FileOutputStream(myfile);OutputStreamWriter osw=new OutputStreamWriter(fos);osw.write(et.getText().toString());osw.flush();osw.close();fos.close();Toast.makeText(getApplicationContext(), "文件已經寫入完成", Toast.LENGTH_LONG).show();} catch (IOException e) {e.printStackTrace();}}});//讀取數據findViewById(R.id.BtnEXternalRead).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {File myfile=new File(sdcard,"this is my file.txt");try {FileInputStream fis=new FileInputStream(myfile);InputStreamReader isr=new InputStreamReader(fis, "UTF-8");char[] input=new char[fis.available()];isr.read(input);isr.close();fis.close();String in=new String(input);show.setText(in);} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});
完整代碼下載:
