java
byte[] bytes;
try {
bytes = inputStream.readAllBytes();
} catch (IOException e) {
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 手动读取
java
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
try {
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "PDF 文件读取失败", Toast.LENGTH_SHORT).show();
return;
}
byte[] bytes = buffer.toByteArray();