Java 在版本APK中使用Intent.ACTION\u OPEN\u文档读取大型文本文件时出现IOException EBADF(错误的文件描述符)

Java 在版本APK中使用Intent.ACTION\u OPEN\u文档读取大型文本文件时出现IOException EBADF(错误的文件描述符),java,android,ioexception,Java,Android,Ioexception,在我的android应用程序中,我提供了一个菜单,可以通过Intent.ACTION\u OPEN\u文档导入一个文本文件(其中包含一些Json数据,稍后我将使用gson进行处理)。这些文件可能很大,5 MB或更大 问题是:当我在手机上直接从Android Studio启动应用程序时,一切都正常,对于大文件也是如此。但是对于发布版apk,如果文件大于500kb(异常由readLine引发),我会获得一个IOException EBADF(坏文件描述符)。如果我从google drive或下载中读

在我的android应用程序中,我提供了一个菜单,可以通过Intent.ACTION\u OPEN\u文档导入一个文本文件(其中包含一些Json数据,稍后我将使用gson进行处理)。这些文件可能很大,5 MB或更大

问题是:当我在手机上直接从Android Studio启动应用程序时,一切都正常,对于大文件也是如此。但是对于发布版apk,如果文件大于500kb(异常由readLine引发),我会获得一个IOException EBADF(坏文件描述符)。如果我从google drive或下载中读取文件,就会出现这种情况

我使用以下方法(从我的活动中调用)阅读代码:

private void importCollection(){
//获取文本文件
意向意向=新意向(意向.行动\打开\文件);
intent.addCategory(intent.CATEGORY\u可打开);
intent.setType(“text/*”);
startActivityForResult(意图、导入集合代码);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
如果(数据!=null){
if(requestCode==导入\收集\代码){
//获取元素
Uri=data.getData();
StringBuilder sb=新的StringBuilder();
BufferedReader BufferedReader=null;
试一试{
ParcelFileDescriptor pfd=getContentResolver()。
openFileDescriptor(uri,“r”);
缓冲读取器缓冲读取器=
新的BufferedReader(新的文件阅读器(pfd.getFileDescriptor());
弦线;

而((line=bufferedReader.readLine())!=null){/greenapps在评论中回答了我的问题:我应该使用InputStream:

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

然后它工作得很好。

你为什么不打开一个输入流而不是使用文件描述符呢?这是一个很好的问题,我没有答案。我要试试。谢谢。这实际上解决了它。谢谢。
    InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(
        inputStream));