当前位置: 首页 > 知识库问答 >
问题:

“即时”解析输入流/重新使用输入流

蔺敏达
2023-03-14

我有一个输入流,其中包含XML数据,我想在返回输入流之前对其进行解析。

InputStream is = myObj.getInputStream();

// parse Inputstream here

return is;

当然,我可以将流保存为字节数组,并从中返回一个新的InputStream,或者

在“myObj”上创建第二个InputStream。

但是有什么方法可以“即时”解析流吗?

编辑:

基本上,我正在寻找一种在解析后重用流的方法。在不消耗流的情况下解析流,分别在解析后重置流。

解决方案:

我找到的解决方案是使用BufferedInpuStream(评论中的注释:最多只能工作8k字节)

BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() );

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;

共有3个答案

沃弘图
2023-03-14

我找到的解决方案(至少对我有用的)是使用BufferedInpuStream:

BufferedInputStream is = new BufferedInputStream ( myObj.getInputStream() );

is.mark( Integer.MIN_VALUE );

// parse Inputstream here

is.reset();

return is;
方飞白
2023-03-14

这可能相当复杂,因为动态xml解析SAX解析器的最佳候选者。它必然是事件驱动的,并依赖回调方法来指示传入流中的事件。

我通过执行以下操作实现了类似这样的东西:

  1. 创建队列
  2. 启动一个线程,使用SAXParser解析XML,将结果推入队列
  3. 遍历队列

这并不简单,但却稳定可靠。我将尝试张贴一些演示代码。

戎桐
2023-03-14

要即时解析,无需等待流结束,您可以使用Sax解析器。

Sax 解析器是基于事件的,因此在处理文档之前不必读取整个文档。这个过程是这样的:

  • 标签人已打开
  • 标记名已打开
  • 标记名已关闭
  • 标记姓氏打开
  • 标记姓氏已关闭
  • 标记人已关闭

对于每个事件,您需要执行一些自定义代码。

使用 sax 解析器比 dom 解析器稍微困难一些,但有一些优点。总而言之,它需要更少的资源,您无需等待拥有整个文档。

 类似资料:
  • 现在准备要构建一个工具,用来把前面idata.txt里的数据按group分行显示,就像这样: 2 9 10 3 1 2 3 我们可以借助语法分析树的Listener机制来对词法分析结束后生成的记号流进行改写,我们不需要实现每一个Listener接口方法,只需要在捕获到group的时候把换行符插到它末尾就行。实现改写的代码如下所示: import org.antlr.v4.runtime.Toke

  • 在1.4节,我们把“解析”定义为分析自然语言句子或形式语言语句之结构的过程。比如,编译器在将代码翻译成机器语言程序之前必须先进行解析。 此外,当你从文件或键盘读取输入时,一般也需要进行解析,以提取想要的信息并发现错误。 例如,我有一个文件distances,其中包含了美国主要城市之间的距离信息。这些信息是我从一个随机选择的网页(http://www.jaring.my/usiskl/usa/dis

  • 本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1. 什么是输入和输出(I / O) 1.1 基本概念 输入/输出这个概念,对于计算机相关专业的同学并不陌生,在计算中,输入/输出(Input / Output,缩写为 I / O)是信息处理系

  • 原因:java.lang.IllegalArgumentException:无法检索类路径资源[BZH91AY&SY 90 WT A%l!!9 d N$L]的InputStream: 在org.springframework.beans.propertyeditors.inputstreameditor.setastext(inputstreameditor.java:77)在org.spring

  • 下面我们要讨论流的输入,这是用流读取运算符(即重载的运算符>>)实现的。流读取运算符通常会跳过输人流中的空格、tab键、换行符等等的空白字符,稍后将介绍如何改变这种行为。 当遇到输入流中的文件结束符时,流读取运算符返回0(false);否则,流读取运算符返回对调用该运算符的对象的引用。每个输入流都包含一组用于控制流状态(即格式化、出错状态设置等)的状态位。当输入类型有错时,流读取运算符就会设置输人

  • 本文向大家介绍浅析Java.IO输入输出流 过滤流 buffer流和data流,包括了浅析Java.IO输入输出流 过滤流 buffer流和data流的使用技巧和注意事项,需要的朋友参考一下 java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题。 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流。 问题引入: 缓冲流为什么比普通的文件字节流效率高? 不带