1. 程式人生 > >資料儲存(五種方式二)-檔案儲存

資料儲存(五種方式二)-檔案儲存

檔案儲存

1.SharedPreference只能儲存一些簡單的資料,要想儲存更多型別的資料,需要使用檔案的儲存操作。有兩種形式:

形式一:直接利用Activity提供的檔案操作方法。此類操作的所有檔案路徑只能是“data\data\<packagename>\files\檔名稱”。

形式二:利用Java IO流執行操作。此類操作的檔案可以儲存在任意路徑下,但需要為其操作授權。

利用Activity類操作資料檔案

1.檔案操作的方法只有兩個:一個是進行檔案的輸出(openFileOutputStream(),返回OutputStream),另一個是進行檔案的輸入(openFileInputStream(),返回InputStream),這兩個方法返回的型別都是Java IO流中的位元組操作流物件。

使用openFileInput()和openFileOutput()方法進行寫入/讀取寫入操作時,接收的檔案中不能包含任何的分隔符(\),只能寫檔名稱,而檔名稱會預設儲存在“data\data\<package name>\files\”目錄中。

2.儲存檔案

publicclass FileOperate extends Activity {

    private static final String FILENAME ="mldn.txt" ; // 設定檔名稱

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        super.setContentView(R.layout.main);

        FileOutputStream output = null ;    // 接收檔案輸出物件

        try {//設定輸出檔案的名稱,及檔案建立模式

            output =super.openFileOutput(FILENAME, Activity.MODE_PRIVATE) ;

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        PrintStream out = newPrintStream(output) ; // 輸出方便

        out.println("姓名:李華;") ;

        out.println("年齡:20;") ;

        out.println("地址:天方夜談學院。") ;

        out.close() ;   // 資源一定要關閉,關閉流

    }

}

3.讀取檔案:

publicclass FileOperate extends Activity {

    private static final String FILENAME ="mldn.txt" ; // 設定檔名稱

    private TextView msg = null ;       // 文字元件

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        super.setContentView(R.layout.main);

        this.msg = (TextView)super.findViewById(R.id.msg) ;

        FileInputStream input = null ;

        try {

        input = super.openFileInput(FILENAME) ; // 取得輸入流

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        Scanner scan = new Scanner(input) ;

        while(scan.hasNext()) {

            this.msg.append(scan.next() +"\n") ;

        }

        scan.close() ;

    }

}

利用IO流操作檔案

1.以上程式直接將檔案儲存在手機的預設儲存空間,要想把檔案儲存在自定義目錄及sdcard上,可以使用傳統的IO流完成。

2.向sdcard上儲存檔案

publicclass FileOperate extends Activity {

    private static final String FILENAME ="/mnt/sdcard/mldndata/mymldn.txt" ;  //設定檔名稱

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        super.setContentView(R.layout.main);

        File file = new File(FILENAME) ;    // 定義要操作的檔案

        if(!file.getParentFile().exists()) {

            file.getParentFile().mkdirs() ; // 建立父資料夾路徑

        }

        PrintStream out = null;//列印流物件,用於輸出

        try {

            out = new PrintStream(newFileOutputStream(file));

            out.println("天方夜譚學院(MLDN,www.baidu.cn),作者:李華");

        } catch (Exception e) {

            e.printStackTrace() ;

        } finally { // 一定要關閉流

            if(out != null) {

                out.close() ;

            }

        }

    }

}

由於用到外部裝置(sdcard),所以要為程式配置相應的許可權。

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3.判斷sdcard是否存在,如果存在則儲存;否則提示不存在,無法儲存。要實現該功能,要使用android.os.Environment類取得目錄的資訊。

publicclass FileOperate extends Activity {

    private static final String FILENAME ="mymldn.txt" ;   // 設定檔名稱

    private static final String DIR ="mldndata" ;  // 操作資料夾的名稱

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        super.setContentView(R.layout.main);

    //如果sdcard存在則建立檔案便於接下來的操作    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

            File file = new File(Environment.getExternalStorageDirectory()

                    + File.separator + DIR +File.separator + FILENAME); // 定義要操作的檔案

            if (!file.getParentFile().exists()){

                file.getParentFile().mkdirs();// 建立父資料夾路徑

            }

            PrintStream out = null;//列印流物件用於輸出

            try {

                out = new PrintStream(newFileOutputStream(file));

                out.println("天方夜譚學院(MLDN,www.MLDNJAVA.cn),作者:李華");

            } catch (Exception e) {

                e.printStackTrace();

            } finally { // 一定要關閉流

                if (out != null) {

                    out.close();

                }

            }

        } else {

            Toast.makeText(this, "儲存失敗,SD卡不存在!", Toast.LENGTH_LONG).show() ;

        }

    }

}

參考文章:Android開發實戰經典