博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java io 下载文件 字节流io典型应用
阅读量:4080 次
发布时间:2019-05-25

本文共 3311 字,大约阅读时间需要 11 分钟。

public String downLoadFromUrl(String urlStr) {        try {            String fileName = getRandomString(20)+".jpg";            String savePath = "/data/back";        //    fileName = urlStr.substring(urlStr.lastIndexOf("/")+1);            URL url = new URL(urlStr);            HttpURLConnection conn = (HttpURLConnection)url.openConnection();            //设置超时间为3秒            conn.setConnectTimeout(3*1000);            //防止屏蔽程序抓取而返回403错误            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");            //得到输入流            InputStream inputStream = conn.getInputStream();            //获取自己数组            byte[] getData = readInputStream(inputStream);            //文件保存位置            File saveDir = new File(savePath);            if(!saveDir.exists()){                saveDir.mkdir();            }            File file = new File(saveDir+File.separator+fileName);            FileOutputStream fos = new FileOutputStream(file);            fos.write(getData);            if(fos!=null){                fos.close();            }            if(inputStream!=null){                inputStream.close();            }            System.out.println("info:"+url+" download success");            String localFile = saveDir+File.separator+fileName;            File fileLocal = new File(localFile);            String retUrl = upload(fileLocal);            fileLocal.delete();            return retUrl;        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e);        }    }    public static  byte[] readInputStream(InputStream inputStream) throws IOException {        byte[] buffer = new byte[1024];        int len = 0;        ByteArrayOutputStream bos = new ByteArrayOutputStream();        while((len = inputStream.read(buffer)) != -1) {            bos.write(buffer, 0, len);        }        bos.close();        return bos.toByteArray();    }

//得到输入流            InputStream inputStream = conn.getInputStream();

得到返回字节流

public static  byte[] readInputStream(InputStream inputStream) throws IOException {        byte[] buffer = new byte[1024];        int len = 0;        ByteArrayOutputStream bos = new ByteArrayOutputStream();        while((len = inputStream.read(buffer)) != -1) {            bos.write(buffer, 0, len);        }        bos.close();        return bos.toByteArray();    }

读取InputStream,将字节流灌入byte数组,通过ByteArrayOutputStream向Byte数组写入数据,这里的ByteArrayOutputStream无非是起一个合并每次读取byte[]的嫁接功能,也可以不用,自己拼接,只要将InputStream全部压入byte[]即可

File file = new File(saveDir+File.separator+fileName);            FileOutputStream fos = new FileOutputStream(file);            fos.write(getData);

通过FileOutputSteam在本地文件中写入数据

核心:

InputStream-byte[]-OutputStream(FileOutputStream)

byte[]为中介

参考:http://blog.csdn.net/qq_25184739/article/details/51205186

2.输出字节流OutputStream

IO 中输出字节流的继承图可见上图,可以看出:

1.    OutputStream是所有的输出字节流的父类,它是一个抽象类。

2.    ByteArrayOutputStreamFileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据。

3.    ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。

 

outputStream中的三个基本的写方法
   abstract void write(int?b):往输出流中写入一个字节。
     void write(byte[]?b) 
:往输出流中写入数组b中的所有字节。
     void write(byte[]?b, int?off, int?len) 
:往输出流中写入数组b中从偏移量off开始的len个字节的数据。

其它方法
   void flush() 
:刷新输出流,强制缓冲区中的输出字节被写出。
     void close() 
:关闭输出流,释放和这个流相关的系统资源。

你可能感兴趣的文章
使用Realsense D435i运行VINS-Fusion并建图
查看>>
matlab函数im2bw_图像分割之阈值分割(matlab)(转载)
查看>>
gazebo似乎就是在装ROS的时候一起装了,装ROS的时候选择的是ros-melodic-desktop-full的话。
查看>>
在React项目中优雅地使用Typescript
查看>>
React + TypeScript 默认 Props 的处理
查看>>
React + TypeScript 实现泛型组件
查看>>
TypeScript 完全手册
查看>>
从React-Native坑中爬出,我记下了这些
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>
手把手入门Fish-Redux开发flutter(上)
查看>>
从React16生命周期到React fiber架构
查看>>
基础算法
查看>>
20道JS原理题助你面试一臂之力!
查看>>
前端面试
查看>>
React Hooks 异步操作踩坑记
查看>>
前端面试-实现一个简版koa
查看>>
彻底搞懂并实现webpack热更新原理
查看>>
聊聊编码那些事,顺带实现base64
查看>>
如何用 Hooks 来实现 React Class Component 写法?
查看>>