Android數據存儲——文件讀寫操做(File)

Android文件讀寫操做
1、文件的基本操做
       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();
        }
 

完整代碼下載:java

 

2、讀取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" >
 
    <Button
        android: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";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.readtxtBtn).setOnClickListener(new OnClickListener() {
 
            @Override
            public 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();
                }
            }
        });
    }
 
完整代碼下載:
 
3、讀取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" >
 
    <Button
        android: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";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.readrawBtn).setOnClickListener(new OnClickListener() {
 
            @Override
            public 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();
                }
            }
        });
    }
完整代碼下載:
 
4、讀寫內部存儲的文件數據
程序一旦在虛擬機或真機運行後,程序就會在固定地方建立一個文件夾。
應用程序的數據文件默認位置保存在:
/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" >
 
    <EditText
        android:id="@+id/et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="在這裏輸入內容" />
 
    <Button
        android:id="@+id/writeBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="保存數據" />
 
    <Button
        android:id="@+id/readBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="讀取數據" />
 
    <TextView
        android: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() {
 
            @Override
            public 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() {
 
            @Override
            public 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 block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
 
完整代碼下載:
 
5、讀寫外部存儲的文件數據
1,認識
外部存儲:每個 Android 兼容設備支持共享的"外部存儲器",你可使用保存的文件。
這能夠是一個可移動存儲媒體 (如 SD 卡) 或內部的 (非可移動) 存儲。保存
到外部存儲的文件是可讀的世界和他們啓用 USB 大容量存儲傳輸計算機上的文件
時,能夠由用戶修改。
謹慎 ︰
       若是用戶在計算機上安裝外部存儲或刪除媒體,並無強制執行時您將保存
到外部存儲的文件的安全,外部存儲能夠變得不可用。全部應用程序均可以讀取和
寫入的文件放置在外部存儲,用戶能夠刪除它們。
SD卡數據存儲路徑;DDMS-->mnt-->sdcard(這裏就是sd卡的掛載的位置)
其實真正的sdcard在storage的sdcard中——所對應的操做目錄。
 
2,讀、寫SD卡上的文件以下步驟:
a,調用Environment的getExternalStorageState()方法判斷手機上是否插入了SD卡,
而且應用程序具備讀寫SD卡的權限。例如使用以下代碼:
//若是手機已插入SD卡,且應用程序具備讀寫SD卡的能力,
//下面語句返回true
Environment.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" >
 
    <EditText
        android:id="@+id/EtExternal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="在這裏輸入內容" />
 
    <Button
        android:id="@+id/BtnExternalSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="寫入數據" />
 
    <Button
        android:id="@+id/BtnEXternalRead"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="讀取數據" />
 
    <TextView
        android: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();
    @Override
    protected 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() {
 
            @Override
            public 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() {
 
            @Override
            public 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 block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
            }
        });
完整代碼下載:
相關文章
相關標籤/搜索