我使用以下代码将文件链接到资源文件夹并阅读文件并编写,然后我通过第三方应用程序打开pdf文件。
这是我的代码;
public void readFile(){
InputStream fileInputStream= null;
String filePath = "PDF/" + name + ".pdf";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
fileInputStream = classLoader.getResourceAsStream(filePath);
int size = fileInputStream.available();
byte[] buffer = new byte[size];
fileInputStream.read(buffer);
fileInputStream.close();
writeFile(buffer, name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeFile( byte[] buffer, String fileName){
try {
File root = Environment.getExternalStorageDirectory();
FileOutputStream fileOutputStream = null;
if (root.canWrite()){
File pdffile = new File("/sdcard/aaa/bbb");
pdffile.mkdirs();
System.out.println(" pdf path "+pdffile.toString());
File outputFile = new File(pdffile.toString());
fileOutputStream = new FileOutputStream(
outputFile+"/" + fileName + ".pdf");
BufferedOutputStream bos = new BufferedOutputStream(
fileOutputStream);
bos.write(buffer);
bos.flush();
bos.close();
}
} catch (IOException e) {
Log.e("Rrror", "Could not write file " + e.getMessage());
}
}
File f = new File("/sdcard/aaa/bbb/"+name+".pdf");
Uri path = Uri.fromFile(f);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
现在有些文件正在阅读并正常打开但很少有文件没有打开它说K
"This Document cannot be opened".
但是,如果我使用assest manager来打开文件,那么它的工作原理非常好。
这里有什么问题,
答案 0 :(得分:3)
“/ sdcard / aaa / bbb”中资源和提取副本的大小不同。这是由于InputStream.available()
返回正确大小的底层资源的错误假设:它只包含可以从此输入流中读取(或跳过)的字节数的估计值,而不会被阻塞下一次调用此输入流的方法(根据JDK JavaDocs)。
因此,您必须更改将输入流复制到字节数组的代码。之前已经在StackOverflow上讨论了这个主题,例如比照Convert InputStream to byte[] in Java(仅考虑忽略该问题涉及图像文件的事实的答案,例如@RichSeller使用Apache commons-io,或者在不引入新依赖关系的情况下,@ Adamski使用{{{ 1}},一个ByteArrayOutputStream
缓冲区,以及一个循环复制而不是文件结束(byte[]
)。可能还有更复杂的is.read(...) != -1
解决方案,但是到底是什么...... 。;)