为什么我的 Sax 解析器在使用 InputStream Read 后没有产生结果?

发布于 2024-08-26 14:06:29 字数 1592 浏览 8 评论 0原文

我有这段代码,我希望它能够告诉我已经下载了多少数据(并很快将其放入进度条中),然后通过我的 Sax 解析器解析结果。如果我基本上注释掉 //xr.parse(new InputSource(request.getInputStream())); 行上方的所有内容并交换 xr.parse 的内容,则它可以正常工作。但目前,我的 Sax 解析器告诉我我什么都没有。这与 is.read (缓冲区)部分有关吗?

另外,请注意,请求是具有各种签名的 HttpURLConnection。

                 /*Input stream to read from our connection*/ 
                 InputStream is = request.getInputStream();
                 /*we make a 2 Kb buffer to accelerate the download, instead of reading the file a byte at once*/ 
                 byte [  ]  buffer = new byte [ 2048 ] ;

                 /*How many bytes do we have already downloaded*/ 
                 int totBytes,bytes,sumBytes = 0; 
                 totBytes = request.getContentLength () ; 

                 while  ( true )  {  

                     /*How many bytes we got*/ 
                         bytes = is.read (buffer);

                         /*If no more byte, we're done with the download*/ 
                         if  ( bytes  <= 0 )  break;       

                         sumBytes+= bytes;

                         Log.v("XML", sumBytes + " of " + totBytes + " " + (  ( float ) sumBytes/ ( float ) totBytes ) *100 + "% done" ); 


                 }
                 /* Parse the xml-data from our URL. */
                 // OLD, and works if comment all the above 
                 //xr.parse(new InputSource(request.getInputStream()));
                 xr.parse(new InputSource(is))
                 /* Parsing has finished. */;

任何人都可以帮助我吗?

亲切的问候,

安迪

I have this piece of code which I'm hoping will be able to tell me how much data I have downloaded (and soon put it in a progress bar), and then parse the results through my Sax Parser. If I comment out basically everything above the //xr.parse(new InputSource(request.getInputStream())); line and swap the xr.parse's over, it works fine. But at the moment, my Sax parser tells me I have nothing. Is it something to do with is.read (buffer) section?

Also, just as a note, request is a HttpURLConnection with various signatures.

                 /*Input stream to read from our connection*/ 
                 InputStream is = request.getInputStream();
                 /*we make a 2 Kb buffer to accelerate the download, instead of reading the file a byte at once*/ 
                 byte [  ]  buffer = new byte [ 2048 ] ;

                 /*How many bytes do we have already downloaded*/ 
                 int totBytes,bytes,sumBytes = 0; 
                 totBytes = request.getContentLength () ; 

                 while  ( true )  {  

                     /*How many bytes we got*/ 
                         bytes = is.read (buffer);

                         /*If no more byte, we're done with the download*/ 
                         if  ( bytes  <= 0 )  break;       

                         sumBytes+= bytes;

                         Log.v("XML", sumBytes + " of " + totBytes + " " + (  ( float ) sumBytes/ ( float ) totBytes ) *100 + "% done" ); 


                 }
                 /* Parse the xml-data from our URL. */
                 // OLD, and works if comment all the above 
                 //xr.parse(new InputSource(request.getInputStream()));
                 xr.parse(new InputSource(is))
                 /* Parsing has finished. */;

Can anyone help me at all??

Kind regards,

Andy

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

时光匆匆的小流年 2024-09-02 14:06:29

'我只能找到一种方法来做到这一点
用字节,除非你知道另一个
方法?'。

但您还没有找到方法。您刚刚编写了不起作用的代码。而且您也不想将输入保存到字符串中。您希望在解析字节时计算字节数。否则您只会增加延迟,即浪费时间并减慢一切速度。有关如何正确执行此操作的示例,请参阅 javax.swing.ProgressMonitorInputStream。您不必使用它,但您肯定必须使用某种 FilterInputStream,可能是您自己编写的,它包裹在请求输入流中并传递给解析器。

'I could only find a way to do that
with bytes, unless you know another
method?'.

But you haven't found a method. You've just written code that doesn't work. And you don't want to save the input to a String either. You want to count the bytes while you're parsing them. Otherwise you're just adding latency, i.e. wasting time and slowing everything down. For an example of how to do it right, see javax.swing.ProgressMonitorInputStream. You don't have to use that but you certainly do have to use a FilterInputStream of some sort, probaby one you write yourself, that is wrapped around the request input stream and passed to the parser.

鼻尖触碰 2024-09-02 14:06:29

您的 while 循环正在消耗输入流,并且没有留下任何内容供解析器读取。

对于您想要做的事情,您可能需要考虑实现包装输入流的 FilterInputStream 子类。

Your while loop is consuming the input stream and leaving nothing for the parser to read.

For what you're trying to do, you might want to look into implementing a FilterInputStream subclass wrapping the input stream.

痴梦一场 2024-09-02 14:06:29

您正在另一个之前消耗其数据的 InputStream 上构建一个 InputStream

如果您想避免只读取单个字节,您可以使用 BufferedInputStream 或不同的东西,例如 BufferedReader 。

无论如何,最好在解析之前获取全部内容!除非你需要动态解析它。

如果你真的想像现在一样保持它,你应该创建两个管道流:

PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream();

pipeIn.connect(pipeOut);

pipeOut.write(yourBytes);

xr.parse(pipeIn);

Java 中的流,就像它们的名字所暗示的那样,没有精确的维度,你也不知道它们何时完成,所以每当你创建一个 < code>InputStream,如果您从中读取数据,则无法将相同的 InputStream 传递给另一个对象,因为数据已经从前一个对象中被消耗。

如果您想同时执行这两项操作(下载和解析),则必须在从 HTTPUrlConncection 接收到的数据之间进行挂钩,您应该:

  • 首先知道正在下载的数据的长度,这可以从 < code>HttpUrlConnection 标头
  • 使用自定义的 InputStream 进行装饰(这是流在 Java 中的工作方式,请参阅 这里)更新进度条..

类似:

class MyInputStream extends InputStream
{
  MyInputStream(InputStream is, int total)
  {
    this.total = total;
  }

  public int read()
  {
    stepProgress(1);
    return super.read();
  }

  public int read(byte[] b)
  {
    int l = super.read(b);
    stepProgress(l);
    return l;
  }

  public int read(byte[] b, int off, int len)
  {
    int l = super.read(b, off, len);
    stepProgress(l);
    return l
  }
}



InputStream mis= new MyInputStream(request.getInputStream(), length);
..
xr.parse(mis);

You are building an InputStream over another InputStream that consumes its data before.

If you want to avoid reading just single bytes you could use a BufferedInputStream or different things like a BufferedReader.

In any case it's better to obtain the whole content before parsing it! Unless you need to dynamically parse it.

If you really want to keep it on like you are doing you should create two piped streams:

PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream();

pipeIn.connect(pipeOut);

pipeOut.write(yourBytes);

xr.parse(pipeIn);

Streams in Java, like their name suggest you, doesn't have a precise dimension neither you know when they'll finish so whenever you create an InputStream, if you read from them you cannot then pass the same InputStream to another object because data is already being consumed from the former one.

If you want to do both things (downloading and parsing) together you have to hook between the data received from the HTTPUrlConncection you should:

  • first know the length of the data being downloaded, this can be obtained from HttpUrlConnection header
  • using a custom InputStream that decorates (this is how streams work in Java, see here) updading the progressbar..

Something like:

class MyInputStream extends InputStream
{
  MyInputStream(InputStream is, int total)
  {
    this.total = total;
  }

  public int read()
  {
    stepProgress(1);
    return super.read();
  }

  public int read(byte[] b)
  {
    int l = super.read(b);
    stepProgress(l);
    return l;
  }

  public int read(byte[] b, int off, int len)
  {
    int l = super.read(b, off, len);
    stepProgress(l);
    return l
  }
}



InputStream mis= new MyInputStream(request.getInputStream(), length);
..
xr.parse(mis);
不弃不离 2024-09-02 14:06:29

您可以将数据保存在文件中,然后将其读出。

    InputStream is = request.getInputStream();
if(is!=null){
File file = new File(path, "someFile.txt");
FileOutputStream os = new FileOutputStream(file);
buffer = new byte[2048];
bufferLength = 0;
    while ((bufferLength = is.read(buffer)) > 0) 
    os.write(buffer, 0, bufferLength);

os.flush();
os.close();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
FileInputStream fis = new FileInputStream(file);
xpp.setInput(new InputStreamReader(fis));
}

You can save your data in a file, and then read them out.

    InputStream is = request.getInputStream();
if(is!=null){
File file = new File(path, "someFile.txt");
FileOutputStream os = new FileOutputStream(file);
buffer = new byte[2048];
bufferLength = 0;
    while ((bufferLength = is.read(buffer)) > 0) 
    os.write(buffer, 0, bufferLength);

os.flush();
os.close();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
FileInputStream fis = new FileInputStream(file);
xpp.setInput(new InputStreamReader(fis));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文