Zum Inhalt springen

Kleines BufferedWriter Problem


wikki

Empfohlene Beiträge

Hallo :)

Ich möchte gern in eine txt Datei schreiben:

 BufferedWriter bw = null;


	     bw = new BufferedWriter(new FileWriter("bla"));
Dann mache ich:
bw.append("<----------------- Ausgabe ----------------->");

	     bw.newLine();

Das klappt soweit wunderbar!

Nun habe ich verschiedene Fälle welche in try - catch Blöcken stehen, also z.b.

wenn a = a gib "blabla" aus usw.

Leider geht das aber nicht. Er zeigt mir zwar oben die Ausgabe an, aber dann hört er auf...

Habt Ihr Ideen woran das liegen könnte? Ich würd euch auch meinen Code zeigen, aber der Sorgt sicher nur wieder für Aufregung, die will ich nicht herrauf beschwören ;D

Danke im Vorraus!

Edit:

Ich habe übrigens alles wie oben also bw.append("") geschrieben, und dannach ein bw.flush() ..

Bearbeitet von wikki
Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke schonmal :)

Also vorab, ich möchte KEINE Diskussion wie sinnvoll oder richtig oder sonstiges mein Programm ist!

Also:

 BufferedWriter bw = null;

	     FileWriter fw = new FileWriter("Portprüfung_ausgabe.txt");

	     bw = new BufferedWriter(fw);


	     bw.append("<----------------- Ausgabe des Virenscanner Portprüfers! ----------------->");

	     bw.newLine();

	     bw.flush();


	       try {

			if (ia.isReachable(1000)){

				   check = true;

				   System.out.println("IP Erreichbar");

			   }

			else {

			System.out.println("IP ist nicht erreichbar!");

			check =false;}

		} catch (IOException e) {

			e.printStackTrace();

		}


	       if (check == true){


			try {


                 Socket s = new Socket(ia,port);

                 System.out.println("Gegenstelle hat Port Nummer: " + port+ ". IP Adresse:  " + hostname);

                 bw.write("IP Adresse:  "+ia+" hat den gesuchten Port: " + port);

                 bw.newLine();

                 bw.flush();


                 s.close();}

			catch (IOException e2) {

					check2 =true;} }


				if (check2 == true){

					try {

		                 Socket s = new Socket(ia,winport1);

		                 System.out.println("Gegenstelle hat Port Nummer: " + winport1+ ". IP Adresse:  " + hostname);

		                 bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch auf den Windowsport:   " + winport1 );

		                 bw.flush();


		                 s.close();}

					catch (IOException e2) {

							check3 =true;} }


				if ( check3 == true){

					try {

						System.out.println("Gegenstelle hat Port Nummer: " + winport2+ ". IP Adresse:  " + hostname);

		                 Socket s = new Socket(ia,winport2);

		                 bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch auf den Windowsport:   " + winport2);

		                 bw.flush();

		        	     bw.close();

			              s.close();}


					catch (IOException e2) {

							check4 =true;} }




				if (check4 == true){

					{ 

						try {

							bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch weder auf den Windowsports:   " + winport1 + "+"  +winport2+ "  Noch auf den gesuchten Port: " + port+"  >>>ER IST DAHER UNSICHER!<<<");

							 bw.flush();


						} catch (IOException e) {

							// TODO Auto-generated catch block

							e.printStackTrace();

						}

					}

				}




				}

		}



10000 Dank im Vorraus :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Darf ich fragen, was der Code dort überhaupt machen soll ?

Was ist:

winport1

winport2

check

check2

check3

check4

Wieso benutzt du Exceptionhandling um irgendwelche Variablen auf true zu setzen ?

Auch wenn es in deinem Kopf logisch aussieht. Das muss nicht zwangsläufig in unseren Köpfen genauso sein.

Der Code dort oben ist ein pures Wirrwarr.

Wenn du damit anfangen würdest, den Code aufzuräumen und v.A. zu kommentieren, dann könntest du die Probleme eventuell sogar selbst lösen.

Ansonsten benutz doch mal:


bw.write("bla");

anstatt dem bw.append().

Den permanenten flush() kannst du dir (meiner Meinung nach) auch sparen.

//Edit

Ich seh grad, dass du den BufferedWriter mitten im Code doch schließst. Aber ihn dann später trotzdem noch ansprichst, wenn er brereits geschlossen ist (check4)

Das wird in einer NPE resultieren.

Benutze try/catch/finally-blocks doch mal korrekt und schließe die Writer/Streams am Ende deines Programms, nicht mitten drin.

Bearbeitet von i � unicode
Link zu diesem Kommentar
Auf anderen Seiten teilen

Woa, immer wenn ich was mit direkt Antworten schreibe (und das war nich wenig eben-.-) isses nachm Absenden weg....anyway:

Also ich poste euch mal die Methode, port und inetaddress wird übergeben alles weitere seht ihr hier:

//Variablen, 2 Windowsports, 4 Schalter für If-Bestimmungen

	     int winport1 = 135;

	     int winport2= 445;

	     boolean check = false;

	     boolean check2 = false;

	     boolean check3 = false;

	     boolean check4 = false;

	     String hostname = ia.getHostName();



		 // Der BuffedWriter und FileWriter

	     BufferedWriter bw = null;

	     FileWriter fw = new FileWriter("Portprüfung_ausgabe.txt");

	     bw = new BufferedWriter(fw);


	     //Erste Zeile im Dokument

	     bw.append("<----------------- Ausgabe des Virenscanner Portprüfers! ----------------->");

	     bw.newLine();



	     //Wenn erreichbar, setze Check auf Wahr, ansonsten nächste IP anpingen

	       try {

			if (ia.isReachable(1000)){

				   check = true;

				   System.out.println("IP Erreichbar");

			   }

			else {

			System.out.println("IP ist nicht erreichbar!");

			check =false;}

		} catch (IOException e) {

			e.printStackTrace();

		}


			//Wenn Check wahr ist, schaue nach ob die IP mit dem übergebenen Port erreichbar ist 

	       if (check == true){


			try {


                 Socket s = new Socket(ia,port);

                 System.out.println("Gegenstelle hat Port Nummer: " + port+ ". IP Adresse:  " + hostname);

                 bw.write("IP Adresse:  "+ia+" hat den gesuchten Port: " + port);

                 bw.newLine();



                 s.close();}

			catch (IOException e2) {

					check2 =true;} }


	       //Wenn nicht, schaue ob die die 2 Windowsports da sind

				if (check2 == true){

					try {

		                 Socket s = new Socket(ia,winport1);

		                 System.out.println("Gegenstelle hat Port Nummer: " + winport1+ ". IP Adresse:  " + hostname);

		                 bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch auf den Windowsport:   " + winport1 );



		                 s.close();}

					catch (IOException e2) {

							check3 =true;} }


				if ( check3 == true){

					try {

						System.out.println("Gegenstelle hat Port Nummer: " + winport2+ ". IP Adresse:  " + hostname);

		                 Socket s = new Socket(ia,winport2);

		                 bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch auf den Windowsport:   " + winport2);


			              s.close();}


					catch (IOException e2) {

							check4 =true;} }



				//Wenn auch nicht, dann gib einfach aus das keiner der fälle oben eingetroffen ist

				if (check4 == true){

					{ 

						try {

							bw.append("IP Adresse:  "+ia+" ist anpingbar, läuft jedoch weder auf den Windowsports:   " + winport1 + "+"  +winport2+ "  Noch auf den gesuchten Port: " + port+"  >>>ER IST DAHER UNSICHER!<<<");



						} catch (IOException e) {

							// TODO Auto-generated catch block

							e.printStackTrace();

						}

					}

				}


				bw.close();



				}

Das Programm pingt eine IP an, schaut ob sie da ist, wenn ja ob der Port da ist, wenn nein ob 2 winports da sind, wenn nein einfach ausgeben das nichts von oben funktioniert hat.

Ich will nochmal BETONEN & BITTEN nicht über den Code an sich zu diskutieren. ich weiß das er weder schön, noch evt. elegant, noch die Problemstellung optimal löst, noch(...). Ich möchte einfach nur das ganze in die Datei schreiben :)

Nochmals 1000 Dank!

Bearbeitet von wikki
Link zu diesem Kommentar
Auf anderen Seiten teilen

Prima.

Trotzdem der Hinweis:

Tu dir selbst einen Gefallen und versuch mal, ordentlich strukturiereten und dokumentierten Code zu schreiben ;)

//Edit:

Ich bin mir nicht sicher, aber ich glaube, dass das hier 1:1 das gleiche macht, wie dein Code:



// Variablen

// hier deine PORTS eintragen:

int[] ports = new int[] { 80, 33, 66, 443, 225, 778, 80, 8080 };

int[] winPorts = new int[] { 135, 445 };


BufferedWriter bw = null;


try {

	// Der BuffedWriter und FileWriter

	bw = new BufferedWriter(new FileWriter("Portprüfung_ausgabe.txt"));


	// Erste Zeile im Dokument

	bw.write("<----------------- Ausgabe des Virenscanner Portprüfers! ----------------->");

	bw.newLine();


	InetAddress ia = InetAddress.getByName("127.0.0.1");

	if (ia.isReachable(1000)) {


		for (int iCounter = 0; iCounter < ports.length; iCounter++) {

			try {

				Socket s = new Socket(ia, ports[iCounter]);

				if (s.isConnected()) {

					System.out.println("Gegenstelle hat Port Nummer: "+ ports[iCounter] + ". IP Adresse:  " + ia.getHostName());

					bw.write("IP Adresse:  " + ia + " hat den gesuchten Port: "	+ ports[iCounter]);

					bw.newLine();

				}else{

					bw.write("IP Adresse:  " + ia + "ist unter dem Port "+ports[iCounter]+" nicht erreichbar");

					bw.newLine();

				}

				s.close();

			} catch (ConnectException ex) {

				continue;

			}

		}

	} else {

		for (int iCounter = 0; iCounter < winPorts.length; iCounter++) {

			Socket s = new Socket(ia, winPorts[iCounter]);

			if (s.isConnected()) {

				System.out.println("Gegenstelle hat Port Nummer: " + winPorts[iCounter] + ". IP Adresse:  "	+ ia.getHostName());

				bw.write("IP Adresse:  " + ia + " hat den gesuchten Port: "	+ winPorts[iCounter]);

				bw.newLine();

			}else{

				bw.write("IP Adresse:  " + ia + "ist unter dem Port "+winPorts[iCounter]+" nicht erreichbar");

				bw.newLine();

			}

			s.close();

		}

	}

	bw.flush();

	bw.close();

} catch (IOException e) {

	e.printStackTrace();

}

Beware of bugs in the above code; I have only proved it correct, not tried it.

Bearbeitet von i � unicode
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hiho,

danke für eure Antworten!

Leider läufts bei mir immernoch nicht, aber ich habe da so anhaltspunkte...vielleicht könnnt ihr mir da helfen:

Die Methode wird ja oft aufgerufen, es ist ja nicht nur eine IP die geprüft wird. Wenn ich daher den BufferedWriter und den FileWriter in der Methode erst anlege, wird er ja auch immer wieder neu aufgerufen, daher überschreibt der bestimmt das File immer wieder oder so... Nun wäre mein Frage wie ich das ändern kann? Ich kann ja nicht das bw an die Methode übergeben oder?

Nochmals vielen Dank!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit dem 2. Parameter hört sich echt gut an! Leider gehts immer noch nicht..auch nicht wenn ich bw übergebe...manno

EDIT:

Doch, es geht! Habe jetzt den Boolean und die übergabe genutzt, es geht =D=D=D

1000DANK leute! Seid echt ne Hilfe gewesen!!

Bearbeitet von wikki
Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch ein Änderungsvorschlag: Wenn du einen Writer/Reader benutzt, muss der am Ende wirklich immer geschlossen werden. Daher würde ich dir empfehlen das immer so zu realisieren:


BufferedWriter bw = null;

try {

   bw = new BufferedWriter(new FileWriter(file));

... dein Code ...

} finally {

   // IOUtils.closeQuitly(bw); <-- Jarkata Commons IO (sehr nützlich)

   if(bw != null) {

      bw.close()

   }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Prima.

Trotzdem der Hinweis:

Tu dir selbst einen Gefallen und versuch mal, ordentlich strukturiereten und dokumentierten Code zu schreiben ;)

//Edit:

Ich bin mir nicht sicher, aber ich glaube, dass das hier 1:1 das gleiche macht, wie dein Code:



// Variablen

// hier deine PORTS eintragen:

int[] ports = new int[] { 80, 33, 66, 443, 225, 778, 80, 8080 };

int[] winPorts = new int[] { 135, 445 };


BufferedWriter bw = null;


try {

	// Der BuffedWriter und FileWriter

	bw = new BufferedWriter(new FileWriter("Portprüfung_ausgabe.txt"));


	// Erste Zeile im Dokument

	bw.write("<----------------- Ausgabe des Virenscanner Portprüfers! ----------------->");

	bw.newLine();


	InetAddress ia = InetAddress.getByName("127.0.0.1");

	if (ia.isReachable(1000)) {


		for (int iCounter = 0; iCounter < ports.length; iCounter++) {

			try {

				Socket s = new Socket(ia, ports[iCounter]);

				if (s.isConnected()) {

					System.out.println("Gegenstelle hat Port Nummer: "+ ports[iCounter] + ". IP Adresse:  " + ia.getHostName());

					bw.write("IP Adresse:  " + ia + " hat den gesuchten Port: "	+ ports[iCounter]);

					bw.newLine();

				}else{

					bw.write("IP Adresse:  " + ia + "ist unter dem Port "+ports[iCounter]+" nicht erreichbar");

					bw.newLine();

				}

				s.close();

			} catch (ConnectException ex) {

				continue;

			}

		}

	} else {

		for (int iCounter = 0; iCounter < winPorts.length; iCounter++) {

			Socket s = new Socket(ia, winPorts[iCounter]);

			if (s.isConnected()) {

				System.out.println("Gegenstelle hat Port Nummer: " + winPorts[iCounter] + ". IP Adresse:  "	+ ia.getHostName());

				bw.write("IP Adresse:  " + ia + " hat den gesuchten Port: "	+ winPorts[iCounter]);

				bw.newLine();

			}else{

				bw.write("IP Adresse:  " + ia + "ist unter dem Port "+winPorts[iCounter]+" nicht erreichbar");

				bw.newLine();

			}

			s.close();

		}

	}

	bw.flush();

	bw.close();

} catch (IOException e) {

	e.printStackTrace();

}

Beware of bugs in the above code; I have only proved it correct, not tried it.
Ey du Nase! Du müsstes es besser wissen! Fliegt ne IOException in deinem Quelltext wird der BufferdWriter nie geschlossen. Lass das Programm dann mal auf dem Systemlaufen dass nur ne beschränke Anzahl an IOStreams erlaubt. Wie wärs mitm try-finally? Bezieht sich auf

try {

 ....


	bw.flush();

	bw.close();

} catch (IOException e) {

	e.printStackTrace();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ ::1

EEEHH! Kumpel!

Das "Ding" da oben habe ich 5 Minuten vor der Mittagspause zusammengewurschtelt.. Wenn mich der Hunger plagt, kann ich nicht mehr klar denken.

Beware of bugs in the above code; I have only proved it correct, not tried it.

Korrekt ist er - d.H.: er funktioniert.. glaub ich. Bugs sind drin.

Der finally müsste noch rein. Aber schau dir doch bitte mal den Original-Code an. Das ist ja nur ein (kleiner?) Teil vom Gesamtcode. Ich glaub, der eine finally-block fällt da nicht mehr soooo ins Gewicht. Aber du hast natürlich recht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hehe, nicht streiten, alles gut :)

Wie gesagt, funktioniert einwand frei!

Eine Frage hätte ich dennoch noch...ist ein wenig was anderes aber es ist mir peinlich andauernd neue Threads zu eröffnen.

Ich habe ein wenig gegoogelt und leider nichts wirklich brauchbares gefunden, aber da euer Fachwissen so enorm ist, hoffe ich das Ihr mal wieder etwas mehr wisst ;)

Allso das da oben ist ja schon perfekt. Aber ich musste aufgrund der Unübersichtlichkeit die Ausgabe ein wenig ändern, leider wurds nicht übersichtlicher <.<. Und zwar sollte es Quasi Tabellenartig ausgegeben, aber da die IP immer anders "lang" ist (ich will den hostnamen ausgeben), rutscht das ganze wild durcheinander...

Daher ist nun meine Frage ob man entweder in ne CSV Datei schreiben kann oder ggf. sogar bei ner normalen Ausgabe das entsprechend...sortiert anordnen könnte?

Ich danke wie immer viel viel mals im vorraus! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Keine Sorge. Wir kennen uns (privat) - das ist kein Streit. Wir hatten schon so manche.. ich sage mal .. sehr fundierte Diskussion zu verschiedensten Themen.

Eine CSV-Datei ist im Grunde nichts anderes, als eine Datei, in der Werte durch Trennzeichen hintereinander gestellt werden..

Siehe: Wikipedia : CSV-Dateiformat

Aber mal so aus reiner Neugier:

Was genau hast du eigentlich vor? Was für ein Projekt ist das?

JavaMail, "Portscanner",... Wozu benötigst du das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um die Weltherrschaft zu erlangen =D

Nein Spaß, es ist einfach nur ein kleines Praktikums Projekt was einfach viele Bereiche abdeckt... hatte nun schon Swing, Datenbank abfragen, Netzwerkprogrammierung, JavaMail, ausgaben in Dateien... Ich lern im Moment echt unheimlich viel dazu und dank eurer Hilfe verschwinden auch offene Lücken schnell :)

Sprich man kann ne CSV auch einfach mitm BufferedWriter schreiben, da muss ich ja nicht mal so viel abändern :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sprich man kann ne CSV auch einfach mitm BufferedWriter schreiben, da muss ich ja nicht mal so viel abändern :)

Ja, kann man.

Ein sehr ernstgemeinter Tipp:

Bevor du weitermachst, gewöhn dir einen (guten) Programmierstil an.

Ich möchte nicht sagen, dass du falsch programmierst, denn es scheint ja irgendwie zu funktionieren..

Wie gesagt... "irgendwie".

Ich sage es immer wieder: Du solltest Programmieren lernen. Und keine Programmiersprache ;)

Auch wenn's eine Praktikumsaufgabe ist - mach's von vorn herein ordentlich. Dann hast du später keine Probleme bei der Umgewöhnung.

Wenn du deine ersten Schritte trotzdem in Java machen möchtest (was übrigens keine schleche Wahl ist) .. kann ich dir den hier empfehlen:

Gailer-Net : Java Tutorial

Um die Weltherrschaft zu erlangen =D

Das, mein Bester, kannste mal getrost wieder vergessen. Die hab ich mir hart erarbeitet.

Bearbeitet von i � unicode
Link zu diesem Kommentar
Auf anderen Seiten teilen

was mir spontan dazu einfällt:

CSV geht grundsätzlich (warum auch nicht?)

du müsstest nur an den richtigen Stellen Semikoli (";") einsetzen (Beispielzeile: IP-Adresse;Port1;Port2;Port3;...)

Tabellenartig:

entweder du versuchst dies über Tabulatoren zu erreichen, wo du aber das Problem haben wirst, dass bei zu großen Schwankungen der Länge diese auch nicht mehr richtig helfen

oder du ermittelst, wie lang die jeweiligen Einträge sind und füllst diese entsprechend mit Leerzeichen auf

da du aber die maximale Länge einer Eintragung wissen musst, kannst du erst nach dem ermitteln der letzten Werte die maximale Länge ermitteln und damit auch erst danach mit der Ausgabe beginnen

dafür wäre es notwendig, dass deine Methode nicht mehr die Datenermittelt und in die Datei ausgibt, sondern dass sie diese ermittelt und (beispielsweise als Objekt einer Klasse, die du noch schreiben muss) zurückgeben

an der aufrufenden Stelle werden die Daten gesammelt, ausgewertet und ausgegeben

(dies würde die Qualität des Codes verbessern, da die Ausgabe der Daten nicht mit der Sammlung der Daten vermischt ist, wodurch ggf. der Code übersichtlicher wird)

generell würde ich dazu raten, dass deine Methode nur die Daten ausliest und sie an anderer Stelle in eine Datei geschrieben werden

Sortierung:

wonach du sortieren willst, weiß ich zwar nicht (möglicherweise nach der Verfügbarkeit der Ports), jedenfalls ict auch dafür eine Sammlung der Daten notwendig (siehe dazu den oberen Puntk)

sobald alle Daten zusammengesammelt sind (für jede IP-Adresse die Methode aufgerufen wurde), kannst du alle Daten miteinander vergleichen und dadurch sortieren

ggf. solltest du dich noch mit den verschiedenen Sortieralgorithmen auseinander setzen (BubbleSort, QuickSort, InsertionSort, ...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...