2016-10-01 35 views
3

我嘗試寫入文件,從套接字接收的數據,我將數據存儲在數組中,但是當我寫入數據時,文件變得太大。我認爲這是由於使用一個大陣列,因爲我不知道數據流的長度...使用write()方法,文件變得太大

但檢查方法寫它聲明寫(byte [] b)寫從指定的字節數組到這個文件輸出流的b.length個字節, write()方法讀取數組的長度,但長度爲2000 ... 我如何知道將要寫入的數據的長度?

... 
byte[] Rbuffer = new byte[2000]; 
dis = new DataInputStream(socket.getInputStream()); 
dis.read(Rbuffer); 
writeSDCard.writeToSDFile(Rbuffer); 

... 

void writeToSDFile(byte[] inputMsg){ 



    File root = android.os.Environment.getExternalStorageDirectory(); 
    File dir = new File (root.getAbsolutePath() + "/download"); 

    if (!(dir.exists())) { 
     dir.mkdirs(); 
    } 

    Log.d("WriteSDCard", "Start writing"); 

    File file = new File(dir, "myData.txt"); 

    try { 
     FileOutputStream f = new FileOutputStream(file, true); 
     f.write(inputMsg); 
     f.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Log.i(TAG, "******* File not found. Did you" + 
       " add a WRITE_EXTERNAL_STORAGE permission to the manifest?"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+2

而不是一次讀取整個文件,你可以寫下來,因爲你下載,然後不管它多麼可能。從InputStream中讀取一點並將其複製到OutputStream,一次說512字節到8 KB。 –

+0

@ peter-lawrey如何在不丟失數據流的情況下只讀取幾位數據......因爲另一個數據流將來到(同時......) –

+0

閱讀「read」方法的文檔。它有一個有用的返回值 – njzk2

回答

2

read()返回讀取的字節數或-1。假設它填充緩衝區,你忽略了兩種可能性,即。你所要做的就是將結果存儲在一個變量中,檢查-1,否則將它傳遞給write()方法。

其實你應該輸入流傳遞給你的方法,並創建該文件後,使用一個循環:

int count; 
byte[] buffer = new byte[8192]; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

你在現在刪除的註釋語句,一個新的輸入流中每個數據包創建不正確。

+0

爲了將它傳遞給write方法,我必須插入一個偏移量(我認爲它將爲0),因爲我希望將所有輸​​入流插入到文件中......但在收到一些消息後,我收到負長度,這是什麼意思,(是傳輸完成?) –

+0

是的。我提到了-1。你有沒有考慮過諮詢Javadoc? – EJP

+0

剛剛意識到,文件對於存儲來說不是太大,文件比它應該大。鑑於文件的預期大小可能會嘗試2048字節的緩衝區。 +1 –