当前位置: 首页 > 面试题库 >

从InputStream读取时发生IOException

暨宸
2023-03-14
问题内容

在 Android平台上从InputStream读取时,我遇到一个奇怪的问题。我不确定这是否是Android特有的问题,或者
总体上我做错了什么。

唯一特定于Android的是此调用:

InputStream is = getResources().openRawResource(R.raw.myfile);

这会从Android资产返回文件的InputStream。无论如何,
这是我遇到的问题:

bytes[] buffer = new bytes[2];
is.read(buffer);

当read()执行时,它抛出IOException。奇怪的是,
如果我进行了两个连续的单字节读取(或任意数量的单字节读取),
也不例外。例如,这有效:

byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();

知道为什么两个连续的单字节读取有效,但是一次调用
一次读取两个都抛出异常吗?该InputStream中似乎罚款...... is.available()
超过一百万字节的回报(因为它应该)。

堆栈跟踪显示以下行 InputStream.read():

java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)

将缓冲区大小更改为单个字节仍然会引发错误。看起来
只有在读入字节数组时才会引发异常。

如果我将文件截断为100,000字节(文件
最初为:1,917,408字节),则工作正常。特定
大小的文件有问题吗?

任何帮助表示赞赏!
谢谢!


问题答案:

(我发给android-developers的帖子没有显示,因此我将尝试
在此处重新发布)

IIRC,此问题来自尝试访问在构建APK过程中被压缩的文件。

因此,要变通解决此问题,请给它一个不会被
压缩的文件扩展名。我忘记了跳过哪些扩展名的列表,但是
已知已经压缩的文件类型(例如mp3,jpg)可能会起作用。



 类似资料:
  • 我试图分块读取输入流并写入文件以避免内存问题,我接收json格式的数据,并使用以下代码写入文件。 我的问题是,大多数json都写得很好,虽然其中一些包含损坏的数据,但我不确定我是否正确地将CharBuffer与BufferedReader一起使用,我观察到的另一件事是,对于少量数据,它正确地将CharBuffer写入文件,当我从服务器接收到更大的数据(大约2MB的输入流-不是很大)时,我通常会遇到

  • 问题内容: 具体来说,问题是编写这样的方法: 如果数据在“超时”毫秒内可用,则返回值与in.read()相同,否则为-2。在方法返回之前,所有产生的线程必须退出。 为避免自变量,此处的主题为java.io.InputStream,如Sun(任何Java版本)所记录。请注意,这并不像看起来那么简单。以下是Sun的文档直接支持的一些事实。 in.read()方法可能是不可中断的。 将InputStre

  • 问题内容: 我正在尝试编写一个读取HTTP请求和响应并对其进行解析的类。由于标题是普通文本,因此似乎最容易使用 BufferedReader 和 readLine 方法读取它们。这显然不会对数据主体起作用,因为它可能是二进制的,所以我想在读取头之后切换到读取原始字节。 现在,我正在做这样的事情: 问题是 BufferedReader 正在提前读取并吞噬流中的所有二进制数据,然后才有机会使用Bins

  • 问题内容: 我已经创建了可执行的jar文件(使用Eclipse),在jar中包含一组图像(.png)文件。所以我添加了一个源文件夹,其中所有图像都位于项目的文件夹中。代码必须访问这些文件才能使用创建BufferedImage 较早前,为了获得我使用的路径 在执行jar时,它抛出错误 URI不是分层的 所以现在我正在使用 但是如何使ImageIO从Inputstream读取?我试过如下 抛出错误 I

  • 在我的应用程序中,我通过蓝牙接收传感器数据,并希望以高效的方式读取数据。数据流如下所示:

  • 问题内容: 我不知道为什么出现java.io.EOFException。从服务器获取二进制流后,我想写一个文件。 这是我的代码 堆栈跟踪 问题答案: 它说,DataInputStream.readByte API不会在EOS上返回-1 返回:此输入流的下一个字节为带符号的8位字节。 抛出:EOFException-如果此输入流已到达末尾。 假定使用DataInputStream.readByte时