【问题标题】:DataInputStream not reading small filesDataInputStream 不读取小文件
【发布时间】:2012-06-11 14:12:09
【问题描述】:

我正在编写一个读取存储在设备上的小文件的黑莓应用程序。 出于某种原因,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。这令人困惑,因为它应该读取文件中的字节数。

【问题讨论】:

  • 您是否遇到了某种错误?
  • 在设备上运行应用程序时没有抛出任何异常。
  • 所以当你说“它不会读取文件”时,你是什么意思?
  • 因为它不会读取文件中的内容并将它们保存到字节数组中。

标签: java blackberry datainputstream


【解决方案1】:

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

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

也就是说,您没有仅读取小文件中的数据这一事实可能是由这一行引起的:

dis.readFully(b);

也许您需要刷新流。此调用将阻塞,直到b.length 字节可用。在使用fconn.isReadable 读取该文件之前检查。

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

【讨论】:

  • 我所有的代码都在这里捆绑的原因是因为这是一个简单的测试应用程序来测试我正在使用的 api 的功能。谢谢你的建议。我马上试试。
  • 刷什么?如何?为什么? InputStreams 没有刷新方法。
  • 你是对的。我已经更新了答案。试试 IOUtilities 方法。您还可以添加一些 println 语句来找出问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2012-08-24
  • 2015-06-26
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多