数据流直接生成zip压缩包(文件主要是对csv格式)

最近在做爬虫项目的时候遇到了点问题,就是从别人的服务器请求后获得的响应byte[]数据,并不想在本地服务器进行转存后再下载,所以就尝试了直接生成下载包。

	public void export_1 (HttpServletResponse response, HttpServletRequest request) {
		//相关网络请求及响应操作省略此处
		{
			//dosomething
		}
		//定义打出的压缩包的名称
		String zipName = "测试";
		//定义写出流
		ZipOutputStream zos = null;
		BufferedOutputStream bos = null;
		try {
			response.setContentType("application/zip");
			response.setCharacterEncoding("utf-8");  
			//这里需要针对打出的压缩包名称的编码格式进行乱码处理:new String(("压缩包名称").getBytes("GBK"), "iso8859-1")
			response.setHeader("Content-Disposition", "attachment; filename=\""
							+ new String((zipName + ".zip").getBytes("GBK"), "iso8859-1") + "\"");
			OutputStream stream = response.getOutputStream();
			bos = new BufferedOutputStream(stream, 64 * 1024);
			zos = new ZipOutputStream(bos);
			//为后续的 DEFLATED 条目设置压缩级别
			zos.setLevel(1);
			//为要添加的文件设置文件名称
			zos.putNextEntry(new ZipEntry("单个的文件名称"));
			Writer w = new OutputStreamWriter(zos, "GBK");
			//这个地方可以单条数据进行写入,也可以把读取到的文件byte[]明确的转为字符串直接写入
			w.write("生成的csv文件内容");
			w.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zos.close();
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

这是最基础的操作,后续有其它需求的可在此基础上扩展,当然,如果通过HttpURLConnection获取到的getInputStream()数据流,是打好的zip包及其他格式也可以通过在此基础上扩展达到目的.

此贴为备注贴,方便以后用到的时候查看。

另附上inputStream流转为byte[]代码

	/**
	 * 将http返回的数据流转为byte[]
	 * @param http
	 * @return
	 * @throws IOException
	 */
	public static byte[] inputStreamToBytes(HttpURLConnection http) throws IOException {
		byte[] data = null;
		InputStream stream = http.getInputStream ();
		try {
			int len = http.getContentLength ();
			if (len >= 0) {
				data = new byte[len];
				int off = 0;
				while (off < len) {
					int read = stream.read (data, off, len - off);
					if (read < 0)
						throw new IOException ();
					off += read;
				}
			} else {
				ByteArrayOutputStream baos = new ByteArrayOutputStream ();
				byte[] buffer = new byte[4096];
				for (;;) {
					int read = stream.read (buffer, 0, buffer.length);
					if (read < 0)
						break;
					baos.write (buffer, 0, read);
				}
				baos.close ();
				data = baos.toByteArray ();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			stream.close ();
		}
		return data;
	}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值