# HttpClient - Daten einer Website "unvollständig"



## Phorx (3. Jul 2010)

Hallo zusammen,

ich logge mich mittels Apaches HttpClient auf eine Seite ein und lese anschließend eine Seite dieser Website aus. Die gewonnen Daten schreibe ich in eine Datei. Klappt soweit ganz gut, allerdings hab ich das Problem dass die Daten gelegentlich unvollständig sind. Zum Beispiel fallen teile der Tags am Ende der Zeile raus

anstatt <b>Name</b> wird dann nur noch <b>Name ausgelesen.

Es ist nicht auf Tags beschränkt, es kommt auch vor das dann der Name nur noch teilweise vorhanden ist.
Es ist kein bestimmtes Muster in den Fehlern zu erkennen, Fehler treten immer an unterschiedlichsten Stellen auf. Daher gehe ich davon aus, dass es sich um einen Fehler beim Auslesen handelt.

Hier ist meine Auslesecode:


```
he = hr.getEntity();
	    	        	if(he != null)
	    	        	{
	    		        	InputStreamReader inreader = new InputStreamReader(he.getContent(), "ISO8859_1");
	    		        	char[] cbuf = new char[2048];
	    		        	if(!new File(path).exists())
	    		        		new File(path).createNewFile();
	    		        	PrintWriter fw = new PrintWriter(new File(path));
	    		        	
	    		        	System.out.println("und abspeichern...");
	    		        	System.out.println("######################################");
	    		        	
	    		        	while(inreader.read(cbuf) != -1)
	    		        	{
	    		        		fw.println(cbuf);
	    		        	}
	    		        	
	    		        	System.out.println("######################################");
		    	        	
		    	        	System.out.println("Daten stehen nun zur Verarbeitung bereit");
	    	        		
		    	        	return true;
	    	        	}
```

Ich hoff es gibt bereits Erfahrungen mit diesen Übertragungsfehlern und ihr könnt mir Tipps zum vollständigen Auslesen der Daten geben oder andere Fehlerquellen nennen. 

Mit freundlichen Grüßen
Phillip


----------



## Empire-P (4. Jul 2010)

while(inreader.read(cbuf) != -1)
	    		        	{
	    		        		fw.println(cbuf);
	    		        	}

gibt in nicht zurück wieviel bytes gelesen wurden? näturlich darfst du in fw dann auch nur diese zahl screiben, und nicht den ganzen buffer,


----------



## Phorx (4. Jul 2010)

read() gibt die Anzahl der eingelesenen Zeichen zurück, das stimmt. Und -1 wenn der Stream zu Ende ist. Das würde meiner Meinung nach höchstens Auswirkung auf das Ende des Streams haben, aber die Fehler kommen auch mittendrin vor. Daher würde ich mal sagen, dass das jetzt eher nicht der Fehler ist !?

Aber danke für den Ansatz!


----------



## Antoras (4. Jul 2010)

Dir ist schon klar, dass 
	
	
	
	





```
cbuf
```
 eine begrenzte Größe hat? Guck mal ob es da einen Überlauf gibt.


----------



## Empire Phoenix (5. Jul 2010)

was ist wenn read weniger als cbuf.lenght zurückgibt? du schreibst dann dennoch die volle bufferlänge in fw.
(Angenommen du hast nur ganze Zeilen,) versuch den hier mal

```
InputStream lin = urlc.getInputStream();
		Reader is = new InputStreamReader(lin ,"Cp1252");
		
		BufferedReader in2 = new BufferedReader( is );
		StringBuffer builder = new StringBuffer();
		for ( String s; ( s = in2.readLine() ) != null; ){
			builder.append(s + "\n"); //eigentlich ist das + hier contraproduktiv, sollten zwei appends sein stattdessen sinvoller weise.
			Thread.yield();
		}
		in2.close();
		is.close();
		lin.close();
		sitecode = builder.toString();
```


----------



## Phorx (5. Jul 2010)

Der Einlesecode von Empire Phoenix klappt einwandfrei!

Vielen Dank an alle :toll::applaus::toll:


----------

