繁体   English   中英

使用Release APK中的Intent.ACTION_OPEN_DOCUMENT读取大文本文件时,IOException EBADF(错误文件描述符)

[英]IOException EBADF (Bad file descriptor) when reading large text files using Intent.ACTION_OPEN_DOCUMENT in Release APK

在我的Android应用程序中,我提供了一个菜单,用于通过Intent.ACTION_OPEN_DOCUMENT导入文本文件(它包含一些稍后将使用gson处理的Json数据)。 这些文件可能很大,5 MB或更大。

问题:当我直接从手机上的Android Studio启动应用程序时,一切都正常,也适用于大文件。 但是对于发行版apk,如果文件大于500kb(异常由readLine引发),我将获得IOException EBADF(错误文件描述符)。 如果我从Google驱动器或下载文件中读取文件,情况就是如此。

我使用以下方法(从我的Activity中调用)读取了代码:

private void importCollection() {
    // Fetch text file
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("text/*");
    startActivityForResult(intent, IMPORT_COLLECTION_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (data != null) {
        if (requestCode == IMPORT_COLLECTION_CODE) {
            // Fetch elements
            Uri uri = data.getData();

            StringBuilder sb = new StringBuilder();

            BufferedReader bufferedReader = null;

            try {
                ParcelFileDescriptor pfd = getContentResolver().
                        openFileDescriptor(uri, "r");
                BufferedReader bufferedReader =
                        new BufferedReader(new FileReader(pfd.getFileDescriptor()));

                String line;

                while((line = bufferedReader.readLine()) != null) { // <-- Exception here
                    sb.append(line);
                    sb.append("\n");
                }

                // ... do something with sb
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(bufferedReader != null) {
                        bufferedReader.close();
                    }
                } catch(IOException e) {
                    // ignore
                }
            }
        }
    }
}

我还尝试将读取文件的代码放入AsyncTask中(无论如何是个好主意),并将FileReader直接传递给gson的fromJson方法,但是我仍然遇到相同的错误。

在StackOverflow上报告了一些类似的案例,在这些案例中,人们在读取更多数据之前不小心关闭了阅读器,但是我的代码中不是这种情况。

我的明显问题是:是否有人知道为什么会发生这种情况和/或解决方法?

greenapps在评论中回答了我的问题: 在官方文档之后,我应该使用InputStream:

    InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(
        inputStream));

然后就可以正常工作了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM