我正在编写一个黑莓应用程序来读取存储在设备上的小文件。 由于某种原因,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。这是令人困惑的,因为它应该读取文件中的字节数。
答案 0 :(得分: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)
,但不要将其用于大文件,否则可能会出现内存不足错误。