Quellcode von Homepage wird nicht komplett eingelesen

Status
Nicht offen für weitere Antworten.

AlexDozer

Aktives Mitglied
Hallo miteinander,

ich hab das Problem das eine Website nicht komplett eingelesen wird. Und ich finde den Fehler nicht.
Code:
	URL url;
	
	private InputStream in;
	private int amountbyte = 100000;
		
	public String getUrlData(String uri, String get)
	{
		byte[] site = new byte[amountbyte];
		int zeichen;
		try 
		{
			url = new URL(uri+get);   //URL erstellen
			in = url.openStream();    //Inputstream öffnen
			
			//Zeichen einlesen
			zeichen = in.read();
			
			if (zeichen == -1)
				return "";
			
			//Doctype überspringen
			//while (in.read() != '>')  
				;			
			
			//Quelltext einlesen
			in.read(site,0,amountbyte);
				
			
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(CReferenz.main, "Kein Internet verfügbar");
	   }
		
					
		System.out.println(new String(site));
		return new String(site).trim();

Wenn ich das ganze so betreibe ist danach in meinem String nur der Anfang vom Doctype
Code:
!DOCTYPE HTML PUBLIC "-//

Wenn ich die Schleife benutze, welche ausgeklammert ist, um den Doctype zu überspringen komme ich bis zur Zeile 288 von 3001 Zeilen. Ich brauch aber alle Zeilen. An der Größe vom byte-Array liegt es nicht!

Jemand eine Idee?


Gruß Alex
 
InputStream.read liest maximal soviele Bytes, wie durch den dritten Parameter vorgegeben wird. Wieviele Bytes tatsächlich gelesen wurden, wird als Rückgabewert geliefert. Man kann also nicht davon ausgehen, dass durch eine Aufruf alle verfügbaren Daten komplett gelesen werden.
 
Hallo Murray,

ich hab es jetzt so gelöst:

Code:
while(true)
			{
				byte [] site = new byte[100000];
				
				if (in.read(side, 0, 100000) == -1)
					break;
				
				sitecomplete += new String(site).trim();
			}

Wahrscheinlich nicht die beste Lösung. Komischerweise muss ich trotz dem trim() beim Hinzufügen zum String (Zeile 8) bei der Rückgabe auch nochmal ein trim() machen:

Code:
return sitecomplete.trim();

Wenn ich ein trim() weglasse werden da irgendwelche Nullen mit zurückgegeben. Jemand ne Ahnung warum?

Gruß Alex
 
new String(site) ist schlecht,
wenn die Datei kleiner als 100.000 ist, dann ist das Array am Ende mit char 0 gefüllt und diese übernimmst du in den String,

noch gefährlicher ist es, wenn die Datei z.B. eine Länge von 120.000 hat,
dann hast du im ersten Schleifendurchlauf 100.000 gültige Zeichen, ok,
im zweiten Durchlauf werden die ersten 20.000 Zeichen des Arrays neu beschrieben,
mit new String(site) erhälst du dann aber einen String mit den 20.000 neuen Zeichen sowie 80.000 weiteren, die immer noch im Array drin sind!, also doppelten Text

deswegen den Rückgabewert von in.read(side, 0, 100000), die Anzahl der Zeichen, im Konstruktor von String mit übergeben,
schau doch einfach nach Beispielen im Internet..
oder hier:
http://www.java-forum.org/de/viewtopic.php?t=74379


mit trim() hat das alles aber weniger zu tun bzw. ein trim() in der while-Schleife sollte genügen solange du diesen Fehler nicht ausbaust,

dass ein zweites trim() ganz am Ende noch eine Änderung bewirkt kann ich mir nicht vorstellen
 
warum ließt du eigentlich zeichenweise?

Code:
 String line = null;
      StringBuffer buffer = new StringBuffer();
      try 
      { 
         url = new URL(uri+get);   //URL erstellen 
         in = url.openStream();    //Inputstream öffnen 
          
         BufferedReader reader = new BufferedReader(InputStreamReader(in));
         
         while((line=reader.readLine())!=null)
            buffer.append(line);
             
          
      } 
      catch (Exception e) 
      { 
         JOptionPane.showMessageDialog(CReferenz.main, "Kein Internet verfügbar"); 
      } 
       
                
      System.out.println(buffer.toString()); 
      return buffer.toString().trim();
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben