数据输入流不读取小文件



我正在编写一个黑莓应用程序,可以读取存储在设备上的小文件。出于某种原因,DataInputStream 只会读取大于 3kb 的文件(我在几次测试后的估计)。有谁知道为什么会这样?

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。这令人困惑,因为它应该读取文件中的字节数。

getActiveScreen().add调用容易出错,如果您尝试从 GUI 线程外部调用它,它将失败。它为您工作的事实意味着您实际上是从 GUI 线程进行这些调用,这是一种可怕的做法,因为您也从那里打开文件。

将连接代码移动到另一个工作线程,并根据需要使用 UiApplication.invokeLaterUiApplication.invokeAndWait 访问 GUI,以将与 GUI 相关的代码包装在参数 Runnables 中。或者使用synchronized(application.getEventLock() .

也就是说,您不仅在小文件中读取数据的事实可能是由以下行引起的:

dis.readFully(b);

也许您需要冲洗流。此调用将阻止,直到 b.length 字节可用。在该文件可读之前,请使用 fconn.isReadable 进行检查。

更新:
您也可以尝试IoUtilities.streamToBytes(dis),但不要将它用于大文件,否则可能会出现内存不足错误。

最新更新