当前位置: 首页 > 知识库问答 >
问题:

下载文件时输入流异常

姬正文
2023-03-14

我正在尝试从服务器下载PPT文件。它以字节为单位。

但在调试时,我注意到输入流在运行时抛出FileNotFound异常。该文件确实存在于服务器上,这是我的代码,如果有任何帮助,我们将不胜感激。

public class DownloadFileAsync extends AsyncTask<String, String, String> {


@Override
protected String doInBackground(String... aurl) {
    int count;

    try {
        URL url = new URL(aurl[0]);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.addRequestProperty("Authorization", "Basic " + SharedPref.getAuthPrefValue());
        connection.addRequestProperty("Device", BaseApplication.getCurrentDevice().getDevice().toString());
        connection.addRequestProperty("DeviceId", BaseApplication.getCurrentDevice().getDeviceId());
        connection.connect();

        int lengthOfFile = connection.getContentLength();
        Log.d("ANDRO_ASYNC", "Length of file: " + lengthOfFile);

        InputStream input = new BufferedInputStream(url.openStream());
        File sdcardDest = new File(Environment.getExternalStorageDirectory(), "Availo");
        String finalDest = sdcardDest + File.separator + "Check1" + "." + "PPT";
        OutputStream output = new FileOutputStream(finalDest);

        byte data[] = new byte[1024];

        long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress(""+(int)((total*100)/lengthOfFile));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();

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


    return null;
}

我在Mac上使用Charles(类似于windows上的fiddler)来查看我从服务器发送和接收的内容。服务器不会返回任何错误,尽管它显示下载步骤6-7秒,下载大约400字节,然后停止。

从输入流行引发异常。

谢谢你!

共有2个答案

狄河
2023-03-14

虽然我同意Muzikant关于下载管理器的观点,但在以下情况下通常会抛出< br > < code > FileNotFoundException ...在本地设备上找不到该文件...

你需要做到以下几点以确保它不会发生

File dest = new File(finalDest);

try{
    File parentDest = dest.getParentFile();
    if(!parentDest.exists()){
    parentDest.mkdirs(); //make all the directory structures needed
   }

if(!dest.exists()){
    dest.createNewFile();
}


OutputStream output = new FileOutputStream(dest);
//now you can use your file dest
//write data to it... 

}catch (Exception e){


}
贺善
2023-03-14

我建议你看看下载管理器系统服务。它是专为您正在尝试做的事情而设计的:

(来自文档)

下载管理器是一个系统服务,处理长时间运行的HTTP下载。客户端可能会请求将URI下载到特定的目标文件。下载管理器将在后台进行下载,处理HTTP交互,并在失败后或连接改变和系统重启时重试下载

 类似资料:
  • 本文向大家介绍基于Java文件输入输出流实现文件上传下载功能,包括了基于Java文件输入输出流实现文件上传下载功能的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制”流“的形式,服务端(servlet)通过  getInputStream() 获取流信息,

  • 我正在阅读Poi(3.7)的excel文件。我正在学习一些关于poi的链接poi快速指南。现在我担心的是: 打开工作簿(.xls HSSFWorkbook或.xlsx XSSFWorkbook)时,可以从文件或InputStream加载工作簿。使用File对象允许更低的内存消耗,而InputStream需要更多的内存,因为它必须缓冲整个文件 在3.7版本的Poi中,WorkbookFactory没

  • 问题内容: 所以我在bash上运行它: 该命令的作用是一直保持运行状态,并且每当我的设备发送某个数据时,例如说它检测到温度变化,它就会输出类似的内容 而且这只会继续运行,并且一旦有任何原因就会输出一些东西。因此,执行无止境。 没有回声运行完美,但是当我尝试使用’>’运算符时,这似乎没有写入文件。 例如 这不能正常工作,my_record_file只获取 间隔 写入的数据,但是我想立即写入。 有任何

  • 情景 我正在尝试用Apache VFS从SFTP服务器(Proftpd)下载一个大文件(>3 GB),编程使用Java。Apache VFS在内部使用来自JSCH的ChannelSftp。 环境 Ubuntu Linux服务器12.4 ProFPTD 1.3.4a OpenSSH 问题 在大约2 GB的数据之后,会话关闭,并从ChannelsFTP抛出IOException。 解决方法 使用Ope

  • 本文向大家介绍Java输入输出流复制文件所用时间对比,包括了Java输入输出流复制文件所用时间对比的使用技巧和注意事项,需要的朋友参考一下 废话不多说,关键代码如下所述: 测试文件是

  • 问题内容: 我有罐子或战争。 我正在以编程方式读取此jar,当我在此jar中找到该jar时,我想再次以编程方式阅读它。 但是JarFile仅提供getInputStream,我无法将其传递给JarFile(File file)构造函数。 如何从罐子中读取罐子? 编辑:我正在考虑以某种方式从类加载器中获取文件。 问题答案: 您可以在文件系统中创建jar文件,例如 并将Stream写入其中。之后,您可