AssetInputStream.read()始终返回-1

时间:2013-10-25 18:31:59

标签: android inputstream android-contentresolver android-assets

我正在编写一个需要为各种目的读取两个图像文件的应用程序。

其中一个图片文件是通过intent-filter接收的,我以这种方式打开它(注意:mIntentgetIntent()的结果):

mFileUri = (Uri) mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
mInputStream = getContentResolver().openInputStream(mFileUri);

然后读取mInputStream按预期工作。

问题是正在阅读第二个图片文件:它的Uri(使用toString()转换)是以共享首选项编写的,我得到了值并使用Uri.parse()来恢复它,因为"默认值" getString()调用中的参数我使用位于assets子目录(Uri scheme)中的本地资源的android.resource。我尝试阅读它的方式是相同的,使用getContentResolver().openInputStream(),但出现问题:在返回的read()上调用InputStream始终返回-1。我还尝试了getAssets().open(),但使用android.resourcecontent方案Uri无效。 注意:对于使用意图的文件,我使用read(byte[]),而第二个使用read()

所以,这是我的问题:为什么会发生这种情况,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我是对的:这是AssetInputStream实施中的错误,因为本机方法_FileAsset::read(void *, size_t)中EOF和I / O错误之间缺乏区别。< / p>

结果是,只有使用AssetInputStreamread(byte[])才能从read(byte[], int, int)进行阅读。

答案 1 :(得分:0)

可以使用'int read()'方法读取资产,请尝试:

AssetManager mgr = getAssets();
try {
    InputStream is = mgr.open("test.txt");
    Log.d(TAG, "onCreate 'is': " + is);
    Log.d(TAG, "onCreate note 'is' is android.content.res.AssetManager$AssetInputStream");
    int c;
    while ((c = is.read()) != -1) {
        Log.d(TAG, "onCreate " + (char) c);
    }
} catch (IOException e) {
    e.printStackTrace();
}

和输出(对于包含字节“qwertyuiop”的文件assets / test.txt是:

D / Test(872):onCreate'is':android.content.res.AssetManager $ AssetInputStream D / Test(872):onCreate note'is'是android.content.res.AssetManager $ AssetInputStream D / Test(872):onCreate q D / Test(872):onCreate w D / Test(872):onCreate e D / Test(872):onCreate r D / Test(872):onCreate t D / Test(872):onCreate y D / Test(872):onCreate u D / Test(872):onCreate i D / Test(872):onCreate o D / Test(872):onCreate p

但由于您没有提供用于创建AssetInputStream的Uri,因此我无法重现您的确切错误。