java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 使用ByteArrayOutputStream下载文件

如何使用ByteArrayOutputStream下载文件

作者:该起什么名字好呢

这篇文章主要介绍了如何使用ByteArrayOutputStream下载文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用ByteArrayOutputStream下载文件

//文件名称
String filepath = ServletActionContext.getServletContext()
        .getRealPath(farmerQrCode.getQrCodeUrl());
        File file = new File(filepath);
        String fileName = new Date().getTime()+".png";
//设置请求信息
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType(response.getContentType());
        response.setHeader("Content-disposition",
                "attachment; filename="+fileName);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int len = 0;
        FileInputStream inputStream = new FileInputStream(file);
        byte [] buffer  = new byte[3];
        while((len = inputStream.read(buffer)) != -1)
        {
            baos.write(buffer, 0,  len);
        }
        byte[] bytes = baos.toByteArray();
        response.setHeader("Content-Length", String.valueOf(bytes.length));
        BufferedOutputStream bos = null;
        bos = new BufferedOutputStream(response.getOutputStream());
        bos.write(bytes);
        bos.close();
        baos.close();

使用POI导出数据,然后将其下载

//此处将HSSFWorkbook wb处理好,然后最后要导出文件时加上此代码。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
        response.setContentType(response.getContentType());
        response.setHeader("Content-disposition",
                "attachment; filename=monthPayment.xls");
        wb.write(baos);
        byte[] bytes = baos.toByteArray();
        response.setHeader("Content-Length", String.valueOf(bytes.length));
        BufferedOutputStream bos = null;
        bos = new BufferedOutputStream(response.getOutputStream());
        bos.write(bytes);
        bos.close();
        baos.close();

1、使用inputStream.read(buffer)方法分段的把txt文本中的内容写入buffer数组。

这里为buffer数组指定了长度为3,所以“hello world!”这组长度为11的数据会被分成4次写入到buffer数组中。

当inputStream.read(buffer)把数据都写入到buffer数组之后,它最后还会返回一次len为-1的值,代表数据完全读完。

2、使用outStream.write(buffer, 0, len)方法,在while循环体内把每次写入到buffer数组的值再次叠加写入到内存缓冲区中。

3、使用outStream.toByteArray()方法把内存缓冲区中的数据流转换成字节数组。

4、最后把字符数组转换成字符串进行返回return new String(data)。

使用ByteArrayOutputStream解决IO乱码

说下经过

今天在用s3接口做ceph储存的时候,要实现一个io下载的接口。

需要把InputStream转成byte[],一开始,是的写法是这样的:

        byte[] buf = new byte[(int) fileSize];
        InputStream in = ossObject.getObjectContent();
        try {
            for (int n = 0; n != -1; ) {
                n = in.read(buf, 0, buf.length);
            }
        } catch (IOException e) {
            log.error(e.getMessage());
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                log.error(e.getMessage());
            }
        }

可是下载的文件稍大一些,就会出现乱码。

于是换了网上推荐的,使用byte缓存的方法,来实现InputStream转成byte[]:

    private static byte[] inputToByte(InputStream inStream, int fileSize) throws IOException {
        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
        byte[] buff = new byte[fileSize];
        int rc;
        while ((rc = inStream.read(buff, 0, fileSize)) > 0) {
            swapStream.write(buff, 0, rc);
        }
        return swapStream.toByteArray();
    }

乱码的情况就解决了!

小结一下

IO这块不是很熟悉,尽量不要用原生的方法去写,而应该使用JDK封装好的方法去实现。避免出现一些意料之外的问题。

PS:至于上面那段代码为什么会出现乱码,暂时还未研究出来。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文