本篇内容主要讲解“怎么使用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();
使用inputStream.read(buffer)方法分段的把txt文本中的内容写入buffer数组。
这里为buffer数组指定了长度为3,所以“hello world!”这组长度为11的数据会被分成4次写入到buffer数组中。
当inputStream.read(buffer)把数据都写入到buffer数组之后,它最后还会返回一次len为-1的值,代表数据完全读完。
使用outStream.write(buffer, 0, len)方法,在while循环体内把每次写入到buffer数组的值再次叠加写入到内存缓冲区中。
使用outStream.toByteArray()方法把内存缓冲区中的数据流转换成字节数组。
最后把字符数组转换成字符串进行返回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(); }
乱码的情况就解决了!
到此,相信大家对“怎么使用ByteArrayOutputStream下载文件”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!