Вы строите InputStream
над другим InputStream
, который потребляет свои данные раньше.
Если вы хотите избежать чтения только одного байта, вы можете использовать BufferedInputStream
или другие вещи, такие как BufferedReader
.
В любом случае лучше получить весь контент перед его разбором! Если вам не нужно динамически разобрать его.
Если вы действительно хотите оставить его включенным, вам нужно создать два потоковых канала:
PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream();
pipeIn.connect(pipeOut);
pipeOut.write(yourBytes);
xr.parse(pipeIn);
Потоки в Java, как следует из их названия, не имеют точного измерения, и вы не знаете, когда они закончат, поэтому всякий раз, когда вы создаете InputStream
, если вы читаете из них, вы не можете передать тот же InputStream
к другому объекту, потому что данные уже используются из предыдущего.
Если вы хотите сделать обе вещи (загрузку и синтаксический анализ) вместе, вы должны подключиться к данным, полученным от HTTPUrlConncection
, вам следует:
- сначала узнайте длину загружаемых данных, это можно получить из
HttpUrlConnection
header
- с использованием пользовательского 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);