0

我有这段代码,我希望能够告诉我下载了多少数据(并很快将其放入进度条中),然后通过我的 Sax Parser 解析结果。如果我基本上注释掉 //xr.parse(new InputSource(request.getInputStream()));上面的所有内容 行并交换 xr.parse 的结束,它工作正常。但此刻,我的 Sax 解析器告诉我我什么都没有。是不是有什么关系。读取(缓冲)部分?

另外,请注意, request 是具有各种签名的 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. */;

任何人都可以帮助我吗?

亲切的问候,

安迪

4

4 回答 4

1

“除非你知道另一种方法,否则我只能找到一种使用字节的方法?”。

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

于 2010-03-26T04:32:41.627 回答
0

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

对于您正在尝试做的事情,您可能希望研究实现包装输入流的 FilterInputStream 子类。

于 2010-03-26T01:32:04.713 回答
0

您正在构建一个之前使用其数据的InputStream另一个。InputStream

如果你想避免只读取单个字节,你可以使用 aBufferedInputStream或不同的东西,比如BufferedReader.

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

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

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

pipeIn.connect(pipeOut);

pipeOut.write(yourBytes);

xr.parse(pipeIn);

Java 中的 Streams,就像它们的名字所暗示的那样,没有精确的维度,你也不知道它们什么时候完成,所以无论何时创建一个InputStream,如果你从它们中读取,你就不能将它传递InputStream给另一个对象,因为数据已经在从前一个消耗。

如果你想同时做这两件事(下载和解析),你必须在从你收到的数据之间挂钩,HTTPUrlConncection你应该:

  • 首先知道正在下载的数据的长度,这个可以从HttpUrlConnectionheader中得到
  • 使用装饰的自定义 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);
于 2010-03-26T01:40:12.247 回答
0

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

    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));
}
于 2012-09-24T05:56:39.243 回答