byte[]bytes;try{bytes=inputStream.readAllBytes();}catch(IOExceptione){e.printStackTrace();Toast.makeText(this,"文件读取失败",Toast.LENGTH_SHORT).show();return;}- 在 Android 开发中,执行上述代码,读取文件内容,出现如下错误信息
java.lang.NoSuchMethodError:No virtual method readAllBytes()[B in class Ljava/io/InputStream; or its super classes (declaration of 'java.io.InputStream' appears in /apex/com.android.runtime/javalib/core-oj.jar)问题原因
InputStream 的 readAllBytes 方法是 Java 9 引入的,但直到 Android API 30(Android 11)才被加入 Android SDK
如果 minSdkVersion 低于 30,在低版本设备上运行时调用 readAllBytes 方法就会抛出 NoSuchMethodError 异常
处理策略
- 不使用 readAllBytes 方法,改用兼容所有 Android 版本的方式,使用 ByteArrayOutputStream 手动读取
ByteArrayOutputStreambuffer=newByteArrayOutputStream();intnRead;byte[]data=newbyte[1024];try{while((nRead=inputStream.read(data,0,data.length))!=-1){buffer.write(data,0,nRead);}}catch(IOExceptione){e.printStackTrace();Toast.makeText(this,"PDF 文件读取失败",Toast.LENGTH_SHORT).show();return;}byte[]bytes=buffer.toByteArray();