gpt4 book ai didi

java - DataInputStream不读取小文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:17 25 4
gpt4 key购买 nike

我正在编写一个黑莓应用程序,该应用程序读取设备上存储的小文件。由于某种原因,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),但不要将其用于大文件,否则可能会出现内存不足错误。

关于java - DataInputStream不读取小文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10981816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com