下载PDF时,InputStream返回空文件

时间:2016-02-27 23:17:23

标签: android pdf inputstream httpurlconnection fileoutputstream

所以我正在尝试使用HttpURLConnection下载PDF文件,我想我已经完成了输入和输出流的一切,但是当我打开下载的PDF文件时(使用Android内置的文件管理器和/或者只是通过将其传输到OS X来检查它,它完全是空的,大小显示为0字节。

我正在尝试下载PDF的网站是:

<子> http://www.pdf995.com/samples/pdf.pdf

这是我的代码

    public static void DownloadFile(final String fileURL, final File directory) {

    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            try {

                try {
                    FileOutputStream f = new FileOutputStream(directory);
                    URL u = new URL(fileURL);
                    c = (HttpURLConnection) u.openConnection();
                    c.setRequestMethod("GET");
                    //c.setRequestProperty("Content-Type", "application/pdf");
                    //c.setDoOutput(true);
                    c.connect();
                    Log.d("debugz", Integer.toString(c.getContentLength()));

                    InputStream in = c.getInputStream();

                    byte[] buffer = new byte[1024];
                    int len1 = 0;
                    while ((len1 = in.read(buffer)) > 0) {
                        f.write(buffer, 0, len1);
                    }
                    f.flush();
                    f.getFD().sync();
                    f.close();


                } catch (Exception e) {
                    e.printStackTrace();
                }


            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();


}


public static String getPDF(String pdfurl) {

    String extStorageDirectory = Environment.getExternalStorageDirectory()
            .toString();
    File folder = new File(extStorageDirectory, "schematisktscheman");
    folder.mkdir();
    File file = new File(folder, "schemainfo.pdf");
    try {
        file.createNewFile();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    DownloadFile(pdfurl, file);

    return null; //added return
}

在我的主要活动中:

SchedulePdfProcessor.getPDF("http://www.pdf995.com/samples/pdf.pdf");
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory() + "/schematisktscheman/schemainfo.pdf")));
编辑:我在主线程上运行了网络代码,这引发了异常。现在为下载创建一个新线程,它获取示例PDF(http://www.pdf995.com/samples/pdf.pdf)并将其内容放在文件中。 感谢@greenapps!

2 个答案:

答案 0 :(得分:1)

首先,替换:

f.close();

使用:

f.flush();
f.getFD().sync();
f.close();

这可确保在继续之前将所有内容写入磁盘。

然后,您需要使用MediaScannerConnectionscanFile()MediaStore了解更新后的文件。

答案 1 :(得分:0)

我在主线程上运行了网络代码,引发了异常。现在为下载创建一个新线程,它获取示例PDF(http://www.pdf995.com/samples/pdf.pdf)并将其内容放在文件中。

{{1}}