PDF文件无法使用类加载器打开

时间:2013-02-18 10:08:35

标签: java android pdf

我使用以下代码将文件链接到资源文件夹并阅读文件并编写,然后我通过第三方应用程序打开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来打开文件,那么它的工作原理非常好。

这里有什么问题,

1 个答案:

答案 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解决方案,但是到底是什么...... 。;)