使用url下载网络图片以及流介绍

使用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操作被中断时,抛出这种类型的异常

原文地址:https://www.cnblogs.com/benniaoxuefei/p/5489365.html