لماذا ساكس محلل لا تنتج النتائج بعد استخدام InputStream القراءة ؟

StackOverflow https://stackoverflow.com/questions/2520558

سؤال

لدي قطعة من التعليمات البرمجية التي آمل أن تكون قادرة على أن تقول لي كم البيانات لقد تم تحميل (وقريبا وضعه في شريط التقدم) ، ثم تحليل النتائج من خلال ساكس محلل.إذا كنت التعليق من الأساس فوق كل شيء //xr.تحليل(جديد InputSource(الطلب.getInputStream())); خط مبادلة xr.تحليل أكثر, أنه يعمل بشكل جيد.ولكن في هذه اللحظة ، ساكس محلل يقول لي ليس لدي أي شيء.هو أن تفعل شيئا مع هو.قراءة (العازلة) القسم ؟

أيضا, مجرد ملاحظة ، طلب هو 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. */;

يمكن لأي شخص أن يساعدني في كل شيء ؟ ؟

مع أطيب التحيات ،

اندي

هل كانت مفيدة؟

المحلول

'أنا فقط يمكن أن تجد طريقة للقيام بذلك مع بايت, إلا إذا كنت تعرف آخر الطريقة؟'.

ولكن كنت لم وجدت طريقة.لقد كتابة التعليمات البرمجية التي لا تعمل.و كنت لا تريد حفظ الإدخال إلى سلسلة إما.تريد عد بايت بينما كنت تحليل لهم. وإلا كنت مجرد إضافة الكمون ، أيإضاعة الوقت وتباطؤ كل شيء إلى أسفل.للحصول على مثال عن كيفية القيام بذلك الحق ، انظر javax.سوينغ.ProgressMonitorInputStream.لم يكن لديك إلى استخدام هذا ولكن أنت بالتأكيد لديك لاستخدام FilterInputStream من نوع ما ، probaby واحدة تكتب لنفسك ، وهذا هو ملفوفة حول طلب تيار الإدخال و تمريرها إلى محلل.

نصائح أخرى

الخاص بك أثناء الحلقة تستهلك دفق الإدخال ولا يترك أي شيء حتى يقرأ المحلل.

لما تحاول القيام به ، قد ترغب في النظر في تنفيذ فئة FilterInputStream التي تغلف دفق الإدخال.

أنت تبني 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 رأس
  • باستخدام إدخال مخصص يزين (هذه هي الطريقة التي تعمل بها التدفقات في جافا ، انظر هنا) تحديث الشبار ..

شيء مثل:

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);

يمكنك حفظ بياناتك في ملف ، ثم قراءةها.

    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));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top