2012-06-26 57 views
1

我正在將數據從一個文件複製到另一個文件。

需要更多時間。什麼原因?

我的代碼是在這裏
從一個文件複製數據到另一個文件在android中很慢?

 
    public void copyData(InputStream in, OutputStream out) throws IOException 
    { 
     try 
     { 
      in = new CipherInputStream(in, dcipher); 
      int numRead = 0; 
      byte[] buf = new byte[512]; 
      while ((numRead = in.read(buf)) >= 0) 
      { 
       out.write(buf, 0, numRead); 
      } 
      out.close(); 
      in.close(); 
     } 
     catch (java.io.IOException e) 
     { 
     } 
    } 

+1

試試這個'byte [] buf = new byte [1024];' – Praveenkumar

+0

你是什麼意思?與需要更多時間的相比。您試圖複製多少數據?你的新舊文件在哪裏?緩衝區大小也是512字節,是否有這樣做的理由? – krammer

+0

我的文件大小是11.8(MB)。我的新舊文件存儲在SD卡中。 – Bala

回答

0

兩個原因

  1. 緩衝區太小,使其4KB或8KB,一直保持到你的手機死機的增加,再往前1個退一步
  2. 閱讀與寫作需要在2個不同的線程上。讀取完成後,將其置於q上,並且在寫入完成後從q讀取它。不要忘記同步q對象。

編寫這樣的代碼時,需要最大限度地使用CPU和內存。線程和while循環是如此的學院C'ish .. :)

+0

對不起。你能給我任何代碼示例部分嗎?謝謝。 – Bala

2

請檢查代碼,我做了什麼,增加緩衝區大小,一旦它觸及1 MB刷新數據,讓你不」 t遇到內存不足錯誤。

原因主要是由於小的緩衝區大小,寫入小字節信息需要時間。最好一次放大塊。

您可以根據需要修改這些值。

public void copyData(InputStream in, OutputStream out) throws IOException 
{ 
    try 
    { 
     int numRead = 0; 
     byte[] buf = new byte[102400]; 
     long total = 0; 
     while ((numRead = in.read(buf)) >= 0) 
     { 
      total += numRead; 
      out.write(buf, 0, numRead); 

      //flush after 1MB, so as heap memory doesn't fall short 
      if (total > 1024 * 1024) 
      { 
       total = 0; 
       out.flush(); 
      } 
     } 
     out.close(); 
     in.close(); 
    } 
    catch (java.io.IOException e) 
    { 
    } 
} 
0

我從一個文件到另一個文件複製數據。

不,你不是。您正在解密輸入流並將明文寫入輸出流。

它需要更多的時間。

更多的時間比什麼?

是什麼原因?

基本上你的微小的緩衝區大小。將其提高到至少8192字節:如果仍然有好處,則更多。

int numRead = 0; 

您不需要初始化此變量。

byte[] buf = new byte[512]; 

請參閱上文。更改爲至少8192

while ((numRead = in.read(buf)) >= 0) 

read(byte[])只能返回零,如果buf.length是零,這是你不希望永遠循環下去,在一個編程錯誤。將條件更改爲> 0。 趕上(java.io.IOException的E) { }

決不忽略異常。

我正在使用操作作爲加密/解密文件。所以這就是我使用緩衝區大小爲512字節的原因。

不,它不是。沒有任何關於加密或解密需要512字節的緩衝區。

相關問題