Standard Ein- und Ausgaben

morphi79

Erfahrenes Mitglied
Hallo,



ich habe schon wieder ein paar Fragen zu o.g. Thema. Folgendes soll ich machen:



Erstellen Sie eine Klasse DateiOutput, deren Methode main() den Inhalt einer Datei Zeile für Zeile einliest und auf der Standardausgabe ausgibt. Bei der Ausgabe soll vor jeder Zeile deren Zeilennummer ausgegeben werden, also z.B.:

1: Text der ersten Zeile.

2: Text der zweiten Zeile.

...

Der Dateiname der einzulesenden Datei soll dem Programm als Kommandozeilenargument übergeben werden. Verwenden Sie zum Einlesen der Datei eine Streamkette, die aus einem FileInputStream, einem InputStreamReader und einem BufferedReader besteht. Berücksichtigen Sie mögliche Fehler wie ein fehlendes Kommandozeilenargument oder Fehler beim Lesen der Datei. In solchen Fällen soll eine aussagekräftige Fehlermeldung auf der Standardfehlerausgabe ausgegeben und das Programm beendet werden.

Hinweise: Die Klasse FileInputStream besitzt einen Konstruktor, der als einziges Argument einen Dateinamen übergeben bekommt. Ein Exception-Objekt besitzt die Methode getMessage(), die eine Beschreibung der Fehlerursache im Klartext liefert.

Wie geht man denn hier vor? Als erstes sollte ich eine Klasse darstellen, die ausgewertet wird oder? Wenn ich das Komandozeilenargumt übergebe, welche Argumete habe ich denn da?
 
Zuletzt bearbeitet:
was meinst du mit "Klasse darstellen, die ausgewertet wird"

und als argument uebergibst du einfach den dateinamen bzw den pfad .
den kannst du dann in der main aus dem "args[ ]" array auslesen..
und diesen uebergibst du dann einfach dem fileinputstream..

und jetzt wuerd ich dir einfach mal empfehlen in die java doku zu schauen, da ist naemlich recht genau beschrieben wie man mit dem fileinputstream umgeht..

*gruessle*
Joerg
 
Mit Kommandozeilenargument meinen die, wenn du das Programm in der Kommandozeile startest, kann du gleich den Namen der zu öffnenden Datei mit übergeben, z. B.:

Code:
java DasProgramm DieDatei

Dieser Dateiname steht dann in dem String-Array, dass du in der main-Methode anlegst
(public static void main(String args[] ). Das kannst du dann einfach mit:

Code:
String datei=args[0]

in einen String speichern.

Mit

Code:
BufferedReader in=new BufferedReader( new InputStreamReader( new FileInputStream( datei)));

kannst du die Datei dann mit einem BufferedInputStream lesen.

Dann machst du eine while-Schleife, die die Datei dann Zeile für Zeile ausliest und zählst am besten noch einen Wert mit hoch(Zeilennummer):

Code:
String zeile;
int zeilenr=1;
while((zeile=in.readLine())!=null)
System.out.println(zeilenr+": "+zeile);


Ich hoffe das hilft dir mal.
 
Also bis jetzt habe ich folgendes gemacht:
Code:
import java.io.*;
public class DateiOutput {
public static void main(String args[]) {
String datei=args[0];	 
		 try {
		 // Erzeuge BufferedReader fuer zeilenweises
		 // Lesen
		 BufferedReader in=new BufferedReader(new InputStreamReader( new FileInputStream(datei)));
		 String gelesen;
 
		 // Lese Zeile fuer Zeile und Ausgabe
		 String zeile;
int zeilenr = 1;
while((zeile=in.readLine())!=null){
	 System.out.println(zeilenr+": " +zeile);
		 zeilenr++;}
 
		 // Freigabe der Ressourcen
		 in.close();
	 } catch (FileNotFoundException e1) {
		 // Wenn die Datei nicht existiert
		 System.err.println("DateiOutput.java "
							+ "nicht gefunden!");
	 } catch (IOException e2) {
		 // andere IOExceptions abfangen.
		 e2.printStackTrace();
	 }
}
}

Habe ich damit die Streakette, welche aus FileInputStream, InputStreamReader und BufferedReader bestehen soll, korrekt eingefügt? Besitzt der FileInputStream den Konstruktor, mit welchem er den Dateinamen übergeben bekommt?

Kann mir jemand weiterhelfen? Die Exception muss eine methode getMessage besitzten, die eine Beschreibung der Fehlerursache im Klartext liefert. Wo setz ich diese hin?
 
Zuletzt bearbeitet:
mit der Exception ist gemeint das du anstelle von e.printstacktrace auch e.getmessage() schreiben kannst, ansonsten sieht es korrekt aus, du solltest nur testen am anfang ob args[0] auch nicht null ist, damit du weisst ob der dateiname eingegeben wurde und du koenntest ein problem bekommen wenn du dateien aufruffst die in anderen verzeichnissen liegen, doch da koennte ein
Code:
datei.replaceAll("\", "\\");
helfen, doch ich vermute das ist nicht teil der aufgabe... :)
 
@ elmato

datei.replaceAll("\", "\\");
das kann nicht funktionieren, weil man bei java mindestens "\\" das schreiben muss :)
 
Hallo, ich habe ein weiterführendes Problem mit dieser Aufgabe wobei der Code bisher so aussieht:

Code:
import java.io.*;

public class DateiOutput

{
	
    public static void main(String[] args)
    
    {
    	
	if (args.length == 0) {
	    System.err.println("Aufruf: java DateiOutput quelldatei");
	    System.exit(0);
	}
	
	String quellDatei = args[0]; // Name der Quelldatei
	String gelesen; // String, der aus Datei gelesen wird
	int counter = 1; // Variable zum Zeilenzaehlen
	
	try {
	    // Streamkette zum Lesen des Dateiinhalts
	    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(quellDatei)));
	    
	    // Lesen und Ausgeben
	    while ((gelesen = in.readLine()) != null) {
		System.out.println(counter + ": " + gelesen);
		counter++;
	    }
	    
	    // Obersten Stream schliessen
	    in.close();
	}
	catch (IOException e) {
	    System.err.println("Es ist ein Fehler aufgetreten: "
			       + e.getMessage());
	}
    }
}



Nun soll im nächsten Schritt die Ausgabe nicht mehr auf der Standardausgabe
erfolgt, sondern wieder in eine (andere) Datei geschrieben wird. Der Name der
Ausgabedatei soll als zweites Kommandozeilenargument an das Programm
übergeben werden. Verwendet werden soll für die Ausgabe eine Streamkette, die aus einem
FileOutputStream und einem PrintStream besteht. Falls die Ausgabedatei bereits
besteht, soll die Ausgabe an den vorhandenen Inhalt angehängt werden.
Berücksichtigt werden soll auch bei den Erweiterungen mögliche Fehler wie eine falsche
Anzahl von Kommandozeilenargumenten oder Fehler beim Lesen oder Schreiben
einer Datei. In solchen Fällen soll eine aussagekräftige Fehlermeldung auf der
Standardfehlerausgabe ausgegeben und das Programm beendet werden.


Nur leider weiss ich nicht wo ich nun ansetzen soll bzw. wie ich die Ausgabe in einer neuen Datei regele.
Bitte um Hilfe =)
 
Erstelle für sowas zukünftig bitte ein eigenes Thema da dieses hier als erledigt markiert ist und sich des somit keiner anschaut ich schau es mir jetzt trotzdem mal an ;)
 
Wäre jetzt mal mein erster Ansatz:
Java:
import java.io.*;
import java.util.ArrayList;

public class DateiOutput

{

	public static void main(String[] args)

	{

		if (args.length == 0) {
			System.err.println("Aufruf: java DateiOutput quelldatei");
			System.exit(0);
		}
		if (args.length < 2) {
			System.out
					.println("Es Wurden zu wenige Argumente übergeben! Bitte geben sie als erstes Argument die InputDatei und als zweites Argument die Output Datei mit!");
			System.exit(0);
		} else if (args.length > 3) {
			System.out
					.println("Es Wurden zu viele Argumente übergeben! Bitte geben sie als erstes Argument die InputDatei und als zweites Argument die Output Datei mit!");
			System.exit(0);
		} else if (args.length == 2) {

			String quellDatei = args[0]; // Name der Quelldatei
			String zielDatei = args[1];
			String gelesen; // String, der aus Datei gelesen wird
			int counter = 1; // Variable zum Zeilenzaehlen
			if(!(new File(quellDatei).isFile()))
			{
				System.out.println("Quelle ist keine Datei!");
				System.exit(0);
			}
			if(!(new File(zielDatei).isFile()))
			{
				System.out.println("Ziel ist keine Datei!");
				System.exit(0);
			}
				
			try {
				// Streamkette zum Lesen des Dateiinhalts
				BufferedReader in = new BufferedReader(new InputStreamReader(
						new FileInputStream(quellDatei)));
				ArrayList<String> arl_output = new ArrayList<String>();
				// Lesen und Ausgeben
				while ((gelesen = in.readLine()) != null) {
					arl_output.add(counter + ": " + gelesen);
					counter++;
				}
				String output[] = new String[arl_output.size()];
				for (int i = 0; i < arl_output.size(); i++) {
					output[i] = arl_output.get(i);
				}
				schreiben(output,zielDatei);
				// Obersten Stream schliessen
				in.close();
			} catch (IOException e) {
				System.err.println("Es ist ein Fehler aufgetreten: "
						+ e.getMessage());
			}
		}
	}

	public static void schreiben(String output[],String zielDatei) {
		// File anlegen
		File file = new File("D:\\FileWriterTest.txt");
		FileWriter writer;
		try {
			// new FileWriter(file ,true) - falls die Datei bereits existiert
			// werden die Bytes an das Ende der Datei geschrieben
			// new FileWriter(file) - falls die Datei bereits existiert
			// wird diese überschrieben
			writer = new FileWriter(file, true);

			for (int i = 0; i < output.length; i++) {
				// Text wird in den Stream geschrieben
				writer.write(output[i]);

				// Platformunabhängiger Zeilenumbruch wird in den Stream
				// geschrieben
				writer.write(System.getProperty("line.separator"));

				// Schreibt den Stream in die Datei
				// Sollte immer am Ende ausgeführt werden, sodass der Stream
				// leer ist und alles in der Datei steht.
				writer.flush();
			}
			// Schließt den Stream
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Grüße
Youza
 

Neue Beiträge

Zurück