java InputStream 复制

tika 是一个解析文档的工具箱,可以自己判别文档种类,再用合适的jar包 解析对应的文档

今天遇到一个需求,把网络上的文件内容解析成数据。

写爬虫,解析页面,对页面进行处理,解析出文件的url

接着就是文件下载到本地,对照tika 的demo 解析数据

可是文件下载到本地占用硬盘空间不说还会消耗磁盘io

既然需要数据只要在内存中处理就好了

使用

inputStream in =response.getEntity

用Tika 解析文件属性和正文,但是tika 分两步解析数据,任何一步都会改变inputStream

解决办法一:

inputStream的复制

ByteArrayOutputStream baos = new ByteArrayOutputStream();

		// Fake code simulating the copy
		// You can generally do better with nio if you need...
		// And please, unlike me, do something about the Exceptions :D
		byte[] buffer = new byte[1024];
		int len;
		while ((len = entity.read(buffer)) > -1 ) {
		    baos.write(buffer, 0, len);
		}
		baos.flush();

		// Open new InputStreams using the recorded bytes
		// Can be repeated as many times as you wish
		InputStream is1 = new ByteArrayInputStream(baos.toByteArray()); 
		InputStream is2 = new ByteArrayInputStream(baos.toByteArray());



第二种:包装inputStream 防止被关闭


InputStream is = null; is = getStream(); //obtain the stream CloseShieldInputStream csis = new CloseShieldInputStream(is); // call the bad function that does things it shouldn't badFunction(csis); // happiness follows: do something with the original input stream is.read();




转载于:https://my.oschina.net/PagodaTree/blog/605743

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值