2012-06-11 36 views
1

我正在編寫一個讀取設備上存儲的小文件的黑莓應用程序。 出於某種原因,DataInputStream將只讀取大於3kb的文件(經過幾次測試後我的估計)。任何人都知道爲什麼會出現這種情況?DataInputStream不讀取小文件

try 
{ 
    fconn = (FileConnection)Connector.open(seedDataLocation); 
    if (fconn.exists()) 
    { 
     UiApplication.getUiApplication().getActiveScreen().add(new RichTextField("Read?: " + fconn.canRead())); 
     UiApplication.getUiApplication().getActiveScreen().add(new RichTextField("Write?: " + fconn.canWrite())); 
     UiApplication.getUiApplication().getActiveScreen().add(new RichTextField("Open?: " + fconn.isOpen())); 

     int dataSize = (int) fconn.fileSize(); 
     DataInputStream dis = fconn.openDataInputStream(); 
     UiApplication.getUiApplication().getActiveScreen().add(new RichTextField("Data Available: " + dataSize)); 
     byte[] b = new byte[dataSize]; 
     dis.readFully(b); 
     String data = new String(b); 
     UiApplication.getUiApplication().getActiveScreen().add(new RichTextField("Data: " + data)); 

     fconn.close(); 
    } 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    UiApplication.getUiApplication().getActiveScreen().add(new RichTextField(e.getMessage())); 
} 

編輯:我試着做dis.available();並且它對於不從文件讀取的小文件返回0,並且從將從其讀取的較大文件返回0。這是令人困惑的,因爲它應該讀取文件中的字節數量。

+3

你會得到某種錯誤? – jtahlborn

+0

在設備上運行應用程序時,我沒有收到任何異常。 – user1449109

+0

所以當你說「它不會讀取文件」時,你是什麼意思? – jtahlborn

回答

1

getActiveScreen().add這個調用很容易出錯,如果你試圖從GUI線程之外調用它,它會失敗。它正在爲你工作的事實意味着你實際上是從GUI線程進行這些調用,這是非常可怕的做法,因爲你也從那裏打開一個文件。

將連接代碼移到另一個工作線程,並根據需要使用UiApplication.invokeLaterUiApplication.invokeAndWait來訪問GUI,以將與GUI相關的代碼包裝到參數Runnables中。或者使用synchronized(application.getEventLock()

這就是說,你是不是在小文件只能通過此行引起的讀取數據的事實:

dis.readFully(b); 

也許你需要刷新流。 此通話將阻止,直到有b.length字節可用。檢查該文件是否可用fconn.isReadable進行檢查。

更新:
您也可以嘗試IoUtilities.streamToBytes(dis),但不要在大文件中使用它,否則可能會發生內存不足錯誤。

+0

以及所有我的代碼捆綁在這裏的原因是因爲這是一個簡單的testapp來測試我正在使用的api的功能。感謝您的建議。我會馬上嘗試一下。 – user1449109

+0

沖洗什麼?怎麼樣?爲什麼? 'InputStreams'沒有flush方法。 – EJP

+1

你說得對。我已經更新了答案。試試IOUtilities方法。您還可以添加一些println句子來發現問題所在。 –