Android資料緩衝區和資料流的學習總結

來源:互聯網
上載者:User

 

Android資料緩衝區和資料流的學習總結(BufferedWriter、BufferedOutputStream和FileOutputStream)

老霍資料流總結之前,先上2個例子。

 

 ==================下面是正確的資料存放區方法==================

 

 

 /**

     * 把位元組數組儲存為一個檔案

     * 

     * @param b

     * @param outputFile

     * @return

     */ 

    public static File getFileFromBytes(byte[] b, String outputFile) { 

        File ret = null; 

        BufferedOutputStream stream = null; 

        try {

               ret = new File(outputFile); 

               FileOutputStream fstream = new FileOutputStream(ret); 

               stream = new BufferedOutputStream(fstream); 

               stream.write(b);

         

        } catch (Exception e) { 

//            log.error("helper:get file from byte process error!"); 

            e.printStackTrace(); 

        } finally { 

            if (stream != null) { 

                try { 

                    stream.close(); 

                } catch (IOException e) { 

//                    log.error("helper:get file from byte process error!"); 

                    e.printStackTrace(); 

                } 

            } 

        } 

        return ret; 

    }

 

 ==================下面是錯誤的資料存放區方法==================

這個有問題的方法,很讓我們頭疼了幾天,周末多宅了幾天終於解決,就是用上面的方法儲存才是正確的。

 

到底會出現什麼樣的錯誤呢?大家不妨說說。其實,我們只需要初始讀來的資料,處理後再儲存,反而是走了彎路,

 

1 是慢  2 是經處理的資料還有錯誤

  /**

  * 儲存資料包

  * @param buffer

  * @throws IOException

  */

   public void saveDAT(byte[] buffer) throws IOException

 {

     SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddhh");  //yyyyMMddhhmmss

  String wid=sDateFormat.format(new java.util.Date());

 

  //Toast.makeText(ClsWaveDiagram.this, "開始測量", 1000).show();

  Log.i("wid:", wid);

  try{

   BufferedWriter bw = new BufferedWriter(new FileWriter(

         "/sdcard/Data/"+wid, true));

   for ( int i = 0; i < buffer.length; i++ ) {

    if(buffer[i]==(byte)0xAA ){ //&& buffer[i+1]==(byte) 0x55

     bw.write(buffer[i+0] & 0xFF);    //AA

     bw.write(buffer[i+1] & 0xFF);    //55

     bw.write(buffer[i+2] & 0xFF);  //XD

      }

   }

   bw.flush();

   //bw.close();

  }

  catch (IOException e) {

  }

 }

 

用到的知識點詳細總結如下 

  ==================bufferedReader和inputstream的執行讀檔案的速度比較==================

  bufferedreader的用法比inputstream要複雜,複雜的存在必然會導致優勢的存在!

  inputstream是一個位元組一個位元組的讀取,每次讀取都會執行一次IO,我們知道io的操作是很費時間的,這就必然會導致程式的效率,  bufferedreader很好的解決這一問題,它可以一次讀取大量的資料,大大減少了io次數,效率也就上去了好比百人座的大巴,一次拉1個學生到學校,和一次拉100個是效率不一樣的。

  ==================BufferedOutputStream和FileOutputStream==================

 

注意:BufferedOutputStream 一定要結合FileOutputStream實用。

   FileInputStream和FileOutputStream的例子中,使用了一個byte數組來作為資料讀入的緩衝區,以檔案存取為例,硬碟存取的速度遠低於記憶體中的資料存取速度。為了減少對硬碟的存取,通常從檔案中一次讀入一定長度的資料,而寫入時也是一次寫入一定長度的資料,這可以增加檔案存取的效率。java.io.BufferedInputStream與java.io.BufferedOutputStream可以為InputStream、OutputStream類的對象增加緩衝區功能。

   BufferedOutputStream的資料成員buf是一個位元組,預設為512位元組。當使用write()方法寫入資料時,實際上會先將資料寫至buf中,當buf已滿時才會實現給定的OutputStream對象的write()方法,將buf資料寫至目的地,而不是每次都對目的地作寫入的動作。

   為了確保緩衝區中的資料一定被寫出至目的地,建議最後執行flush()將緩衝區中的資料全部寫出目的流中。 

 

  ==================System.arraycopy(temp, 0, btBuf, 0, btBuf.length);==================

 Java標準類庫提供static方法System.arraycopy(),用它複製數組比用for迴圈複製要快得多,     System.arraycopy()針對所有的類型做了重載,需要5個參數。

    第一個參數:源數組。

    第二個參數:位移量,即從哪個位置開始複製的索引。

    第三個參數:目標數組。

    第四個參數:位移量。

    第五個參數:要從源數組中複製到目標數組元素的個數,一般情況下為目標數組的長度。

例:

    從A數組中複製元素到B數組?

    public class Practice {

        public static void main(String[] args){

            String[] A = {"H","e","l","l","o"};

            String[] B = new String[3];

            System.arraycopy(A, 0, B, 1, B.length - 1);

          for(int i = 0; i < B.length; i ++){

                 System.out.print(B[i] + " ");

            }

      }

    }

    運行結果為:null H e;

 

 

如轉載,請註明出處。老霍出品

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.