如何使用ByteArrayOutputStream下载文件

作者:该起什么名字好呢 时间:2021-07-29 11:32:45 

使用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:至于上面那段代码为什么会出现乱码,暂时还未研究出来。

来源:https://blog.csdn.net/djh_it/article/details/53322439

标签:ByteArrayOutputStream,下载文件
0
投稿

猜你喜欢

  • 二叉搜索树实例练习

    2022-09-20 22:03:06
  • Java 中很好用的数据结构EnumSet

    2023-12-06 09:37:23
  • 新手初学Java集合框架

    2022-10-06 03:01:51
  • Android手动检查并申请权限方法

    2023-08-04 23:14:17
  • SpringBoot打Jar包在命令行运行流程详解

    2023-11-24 16:53:59
  • java语言基础之标识符和命名规则详解

    2023-04-21 16:50:18
  • java递归实现汉诺塔步骤介绍

    2022-03-03 09:44:17
  • Java实现手写线程池的示例代码

    2022-01-09 13:08:24
  • java实现上传图片并压缩图片大小功能

    2023-06-14 22:32:35
  • 使用Android studio创建的AIDL编译时找不到自定义类的解决办法

    2023-06-23 10:59:41
  • Mybatis Lombok使用方法与复杂查询介绍

    2023-03-30 00:30:13
  • 详解Spring全局异常处理的三种方式

    2023-11-11 15:31:47
  • Java 10 局部变量类型推断浅析

    2023-11-25 06:24:13
  • Mybatis逆向工程运行代码实例

    2021-06-22 04:54:59
  • Mybatis分页插件PageHelper的使用详解

    2022-02-26 16:43:05
  • C#实现将DataTable内容输出到Excel表格的方法

    2023-05-01 15:20:38
  • C#导入导出EXCEL文件的代码实例

    2022-04-21 07:15:15
  • Java编程思想里的泛型实现一个堆栈类 分享

    2021-07-21 20:37:14
  • Day14基础不牢地动山摇-Java基础

    2023-03-21 09:04:46
  • Android实现简易浏览器遇到问题的解决方法

    2023-06-15 21:47:56
  • asp之家 软件编程 m.aspxhome.com