1

我正在使用下面的代码将文件链接到资源文件夹并读取文件并写入,然后我通过 3rd 方应用程序打开 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".

但是,如果我使用资产管理器打开文件,它工作得很好。

这里有什么问题,

4

1 回答 1

3

“/sdcard/aaa/bbb”中资源和提取副本的大小不同。InputStream.available()这是由于返回正确大小的基础资源的错误假设:它仅包含可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此方法的方法阻塞输入流(根据 JDK JavaDocs)。

因此,您必须更改将输入流复制到字节数组的代码。这个主题之前已经在 StackOverflow 上讨论过,例如 cf。将 InputStream 转换为 Java 中的 byte[](仅考虑忽略该问题是指图像文件这一事实的答案,例如 @RichSeller 使用 Apache commons-io 的答案,或者在不引入新依赖项的情况下,@Adamski 使用的答案a ByteArrayOutputStreambyte[]缓冲区和不在文件末尾(is.read(...) != -1)的循环复制。可能还有更好的nio解决方案,但到底是什么......;)

于 2013-02-18T11:31:24.597 回答