Datentypen Stringbuilder vollständig leeren

Aurus

Mitglied
Hi!

Mein aktuelles kleines Testprojekt nimmt einen Befehl entgegen der via DatagramPacket reinkommt, führt diesen aus und liest eben das resultat des ausgegebenen Befehles aus.

Jede einzelne Zeile vom cmd output wird mittels Append in den Stringbuilder sb geschrieben.

Am Ende wird das Resultat halt wieder zum Absender zurückgeschickt.

Habe jetzt das Problem das ich den Stringbuilder nicht wirklich geleert bekomme. Und zwar wenn ich beispielsweise den Befehl "hostname" ausführe und danach den Befehl "dir" ist der Wert im Stringbuilder "dirtname" 😳

Habe versucht den Builder wie folgt zu leeren:

Java:
sb.setLength(0);
sb.delete(0, sb.length());

Danke! :toll:
 
Hm, bei mir genügt ein einzelnes
Code:
setLength(0)
.
Dein genannter Code ist übrigens in dieser Reihenfolge sinnfrei, weil du die Länge erst auf 0 setzt und dann bis zu dieser Länge löschst.
 
Ich poste mal eben den ganzen Code:

Java:
public static void main(String[] args) throws IOException
	{
		DatagramSocket serverSocket = new DatagramSocket(9876);
        
		byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        
        
        while(true)
        {
             
       	 	  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
              serverSocket.receive(receivePacket);
              
              String sentence = new String(receivePacket.getData());
              System.out.println("einkommender Befehl: " + sentence);      

              Process p = Runtime.getRuntime().exec("cmd /C " + sentence);
              BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));  
              
              StringBuilder sb = new StringBuilder();

              while((r.readLine()) != null)
              {
            	  sb.append(r.readLine() + "\n");
              }
              
              String full_cmdoutput = sb.toString();
              System.out.println(full_cmdoutput);
              
              InetAddress IPAddress = receivePacket.getAddress();
              int port = receivePacket.getPort();

              sendData = full_cmdoutput.getBytes();
       
              DatagramPacket sendPacket = new DatagramPacket(
            		  sendData, 
            		  sendData.length, 
            		  IPAddress, 
            		  port			);
              
              serverSocket.send(sendPacket);
              
              full_cmdoutput = null;
              sentence = null;
              
             // sb.setLength(0);
              sb.delete(0, sb.length());
                           
              System.out.println(sb.toString());
        }	  
	}

Eigentlich wird der Stringbuilder beim durchlauf schon immer neu erzeugt.. Funktioniert leider noch nicht

Danke für die Antworten
 
Wieso willst du ihn denn dann überhaupt leeren? Es hat ja gar keinen Effekt da er eh immer neu erzeugt wird.

Außerdem ist der Code in der while-Schleife fehlerhaft, weil du jede erste Zeile überspringst! Der
Code:
readLine()
-Aufruf liefert dir eine Zeile zurück, die du aber in der while-Bedingung gar nicht verwendest. Ich schätze der Fehler liegt hier!

Korrekterweise sollte es wie folgt sein:
Java:
String line = null;
while ((line = r.readLine()) != null) {
    sb.append(line).append("\n"); //das + kann man sich hier auch sparen
}
 
Danke nun funktionierts schonmal um einiges besser.

Wenn ich davor beispielsweise den Befehl hostname abgesetz habe habe ich das Resultat null bekommen, das is jetzt nicht mehr der Fall. Allerdings bekomme ich wenn ich beispielsweise "hostname" und dann "dir" eingebe immer noch "dirtname" raus.

Dankesehr
 
Ahh habs nun so gemacht das ich das Byte array einfach mit in die While Schleife gepackt habe. Sprich das Array wird bei jedem Durchlauf neu erzeugt. So funktionierts, danke 🙂
 

Zurück
Oben