使用url下载网络图片的时候,首先需要建立一个URL对象,然后使用一个输入流获取该URL中的内容。之后使用读取该输入流的内容,使用一个输出流写到本地文件中。最后关闭输入和输出流。下面是一个简单的下载代码。

    public static void download(String urlString, String filename, String savePath) {
        URL url = null;
        OutputStream os = null;
        URLConnection con = null;
        InputStream is = null;
        try {
            url = new URL(urlString);
            con = url.openConnection();
            con.setConnectTimeout(5 * 1000);
            is = con.getInputStream();
            byte[] bs = new byte[1024];
            int len;
            File sf = new File(savePath);
            if (!sf.exists()) {
                sf.mkdirs();
            }
            os = new FileOutputStream(sf.getPath() + "\\" + filename);
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
           try {
                if(os != null)
                    os.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            } 
            try {
                if(is != null)
                  is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            }
        }
    }   

什么是流。

流是一个抽象的概念,是对输入输出设备的抽象,java程序中,对于程序的输入输出操作都是以"流"的方式进行。设备可以是文件,网络,内存等。
流具有方向,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们称之为输出流,反之我们称为输入流。
当文件需要从某个数据源读入数据的时候,就会开启一个输入流,数据源可以是文件、内存或网络等等。相反的,需要写出数据到某个数据源目的地的时候,也会开
启一个输出流,这个数据源目的地也可以是文件、内存或网络等等。流的使用结束必须关闭流,如果不进行关闭的化会一直占用内存可能早成内存的泄露。

总结:

数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络),即将数据读入程序的通信通道。
输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、文件、网络)的通信通道。
数据的传输就是数据流的传输,流的重定向就是输入或者输出的改变。

流有哪些分类

可以从不同的角度对流进行分类:

1、处理的数据单位不同,可分为:字符流,字节流

2、数据流方向不同,可分为:输入流,输出流

3、功能不同,可分为:节点流,处理流

节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流。例如FileInputStream和FileOutputStream,他们直接从文中读取或往文中写入字节流。

处理流:“连接”在已存在的流之上通过对数据的处理为程序提供更加强大的读写功能。处理流是使用一个已经存在的输入流或输出流连接创建的,过滤流就
是对节点流进行一系列的包装例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构建,提供
带缓冲的读写,提高了读写的效率。

字节流和字符流的区别:

1.读写单位不同:字节流以字节为单位读取,字符流以字符为单位,根据编码表映射字符一次可以读取多个字节。

2.处理对象不同:字节流能处理所有的类型数据,而字符流只能处理字符类型的数据。

3.字节流在操作的时候是不会用到缓冲区的,是文件本身的直接操作;而字符流在操作的时候会用到缓冲区。

结论:优先使用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

IOException异常类的子类

1.public class  EOFException :
非正常到达文件尾或输入流尾时,抛出这种类型的异常。

2.public class FileNotFoundException:
当文件找不到时,抛出的异常。

3.public class InterruptedIOException:
当I/O操作被中断时,抛出这种类型的异常

使用url下载网络图片以及流介绍的更多相关文章

  1. java 下载网络图片

      java 如何下载网络图片 CreateTime--2017年9月30日11:18:19 Author:Marydon 说明:根据网络URL获取该网页上面所有的img标签并下载符合要求的所有图片 ...

  2. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  3. Python下载网络图片方法汇总与实现

    本文介绍下载python下载网络图片的方法,包括通过图片url直接下载.通过re/beautifulSoup解析html下载以及对动态网页的处理等. ​ 很多人学习python,不知道从何学起.很多人 ...

  4. .Net 使用爬虫下载网络图片到本地磁盘

    准备: 1.新建控制台项目 2.引用System.Drawing类库 3.安装HtmlAgilityPack 1.5.2.0 4.如果不会XPath语法的话,建议简单看下 代码: static voi ...

  5. java 根据Url下载对应的文件到指定位置,读txt文件获取url

    package test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...

  6. android下载网络图片并缓存

    异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ...

  7. Go语言下载网络图片或文件

    最近闲来无事, 于是就简单学习了下Go语言的基本的用法.由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言 文件下载到本地,通常的思路就是先获得网络文件的 输入流 以及本地文 ...

  8. [Xcode 实际操作]八、网络与多线程-(13)使用异步方式下载网络图片

    目录:[Swift]Xcode实际操作 本文将演示如何通过异步请求的方式,下载网络图片. 异步请求与同步请求相比,不会阻塞程序的主线程,而会建立一个新的线程. 在项目导航区,打开视图控制器的代码文件[ ...

  9. android 下载网络图片并缓存

    异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ...

随机推荐

  1. mysql部署到云主机的笔记

    写了个程序,需要把数据库部署到云主机上 MySQL基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限 为了安全,新添加一个用户来进行远程登录 登录MYSQL: ...

  2. Plextor 浦科特M7VC性能

    浦科特一出TLC的SSD,立刻就受到了人们的关注,网上铺天盖地的评测.看了评测感觉不错,于是买了一块来用. 自己测试,似乎和网上的结果差异挺大的. 这是我自己测试的结果.(测试平台为:I7-5820K ...

  3. mac上安装Navicat Premium 破解版+汉化包

    Navicat是一款非常强大的sql分析管理工具.以前一直在windows上面使用. 由于工作的需要,我也是折腾出了这不易的mac破解版.下了好多网上的版本,亲测这个可用. 俗话说:工欲善其事,必先利 ...

  4. 循环多次ajax请求

    最近在做网页前端,其中有个功能按钮是从数据表格中同时删除多条数据,涉及到循环多次ajax请求 但是老是出现一些请求被忽视的情况,应该是由于for循环在极短时间内被完成,所以第一次请求后的几次请求时,x ...

  5. noi 2985 数字组合

    题目链接: http://noi.openjudge.cn/ch0206/2985/ 2985:数字组合 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正 ...

  6. VIM 常用错误解决

    1.option ‘omnifunc’ is not set 错误: vim7下Omni completion默认情况下是没有开启的,有时候自定义的vimrc文件会实现自动补齐,例如vim-autoc ...

  7. WPFの三种方式实现快捷键

    最近,对wpf添加快捷键的方式进行了整理.主要用到的三种方式如下: 一.wpf命令: 资源中添加命令 <Window.Resources> <RoutedUICommand x:Ke ...

  8. 第三章 对象(JavaScript:语言精粹)

      对象是属性的容器,其中每个属性都有名字和值.   3.0. 概览:对象字面量 | 检索 | 更新 | 引用 | 原型 | 反射 | 枚举 | 删除 | 减少全局变量污染   3.1. 对象字面量 ...

  9. iOS 推送

    1,推送已至,点通知栏: a)若App在UIApplicationStateActive(活动)状态,调用 //接收到推送消息 - (void)application:(UIApplication * ...

  10. mysql 通过IP连接

    解决方法如下: 编辑my.ini 在[mysqld]节点下新增或修改如下两行行 skip-name-resolve #忽略主机名的方式访问 lower_case_table_names= #忽略数据库 ...